---
title: <center> <strong> Near, far, wherever you are - Phenotype-related variation in pharmacogenomic effect sizes across the psychiatric drug literature. </strong> </center>
author: <center> <small> Siobhan Lock  </small> </center>
date: <center> <small> `r format(Sys.Date(), format="%B %d %Y")` </small> </center>
output: 
  html_document:
    css: "style.css"        
    code_download: true 
    code_folding: 'hide'
    theme:
      color-contrast-warnings: false
      bg: "#EFEFEF"
      fg: "#000"
      primary: "#398235"
      secondary: "#398235"
      base_font:
        google: Montserrat
      heading_font:
        google: Bungee
      code_font:
        google: "Roboto Mono"
    highlight: pygments
    
---

<style> 



body {
  max-width: 1920px;
  margin-left: auto ;
  margin-right: auto;
}


#header { 
/* Permalink - use to edit and share this gradient: https://colorzilla.com/gradient-editor/#c9de96+0,8ab66b+44,398235+100;Green+3D+%233 */
background: linear-gradient(to bottom,  #c9de96 0%,#8ab66b 44%,#398235 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */


  color: #EFEFEF;
  height: 400px;
  padding: 15px;
  }

.main-container {
  max-width: 1200px;
  margin-left: auto;
  margin-right: auto;
  }

div.blue { background-color:#EFEFEF; border-radius: 20px; padding: 20px;}

</style>

<br>
<br>

```{r setup, warnings = FALSE, include=FALSE, fig.align='center'}
knitr::opts_chunk$set(warning = FALSE, message = FALSE, echo = TRUE, fig.align = "center", dev = "png", dev.args=list(bg="transparent")) 
options(knitr.kable.NA = '')
#options(scipen = 0)
#options(digits = 3)

library(tidyverse)
library(ggplot2)
library(metafor)
library(clubSandwich)
library(data.table)
library(ggplotify)
library(esc)
library(kableExtra)
library(pwr)
library(gsubfn)
library(gtsummary)
library(orchaRd)
library(emmeans)
library(ape)
library(phytools)
library(flextable)
library(R.rsp)
library(flexmix)
library(cowplot)

set.seed(666)

pal <- c("#43919c", "#e4959a", "#519E8A", "#edeee2")

source("functions.R")
load("all_smds.RData")

og <- all_smd

all_smd <- all_smd %>% filter(SMD < 5 & SMD > -5) 

l1 <- readxl::read_xlsx(path = "archives.xlsx", sheet = 2)
l2 <- readxl::read_xlsx(path = "archives.xlsx", sheet = 3)

```



# Near, far, wherever you are: Phenotype-related variation in pharmacogenomic effect sizes across the psychiatric drug literature. {.tabset}

<br>

**Siobhan K. Lock, Djenifer B. Kappel, Jude Hutton, Emily Simmonds, Sophie E. Legge, Michael C. O'Donovan, and <a href = "mailto: PardinasA@cardiff.ac.uk"> Antonio .F. Pardiñas </a> **

<br>

**Background:** Pharmacogenomics is viewed as one route to minimising inter-individual variability in drug response. However, uptake in psychiatry is slower than in other medical fields, so assessing evidence for psychiatric genotype-drug pairs and understanding what influences the magnitude of these effects is essential.

**Methods:** We performed a systematic search for studies investigating pharmacogenomic variation in the context of antipsychotic and antidepressant use. Outcomes varied, including those related to drug bioavailability (“proximal”) or side effects, symptom severity, and other treatment outcomes (“distal”). We performed a meta-analysis moderated by outcome type to quantify the average pharmacogenomic effect size across proximal and distal outcomes and assess whether they differ from one another. We developed a companion dashboard that allows users to explore the dataset and perform simplified meta-analyses, power calculations, and Bayesian shrinkage analyses based on drugs, enzymes, and outcomes of interest.

**Results:** We analysed 2,092 standardised mean differences (SMDs) from 184 studies, finding evidence that pharmacogenomic effect sizes for proximal outcomes were significantly larger than distal (Δβ = -0.206 [95% CI -0.291 – -0.121], *p* = 5x10⁻⁶). This trend was consistent across sub-groups restricted to the most common gene-drug pairings in the dataset. Power calculations for hypothetical future studies using two-sample *t*-tests showed that, to attain at least 80% statistical power, analyses of distal outcomes require a larger sample size than proximal outcomes.  

**Discussion:** We demonstrate that pharmacogenomic effect sizes are significantly larger for proximal outcomes related to pharmacokinetics than for distal outcomes related to efficacy and toxicity. Understanding how the biological mechanisms underlying different outcomes might impact pharmacogenomic effect sizes could help to inform participant recruitment for future psychiatric pharmacogenomic studies, alongside the development of pharmacogenomic guidelines for psychiatric medications.

**Funding:** This work was supported by a PhD studentship from Mental Health Research UK (SKL). Authors were also supported by grants from the Medical Research Council (SEL, MCOD, AFP; MR/Y004094/1 and MR/Z503745/1), the European Union’s Horizon 2020 programme (DBK, MCOD, AFP; #964874), the European Union’s Horizon 2021 programme (AFP, #101057454), and the Dementia Research Institute (ES; UKDRI supported by the Medical Research Council (UKDRI-3206), Alzheimer’s Research UK, and Alzheimer’s Society).

**Acknowledgements:** We would like to thank Peter A. Holmans for critical feedback on the manuscript.


<br>
<br>
<br>


## <strong> Introduction </strong>


### Introduction

The effects of most licensed therapeutic drugs vary even when prescribed to individuals for the same indication. Moreover, real-world effectiveness often falls below the expectations set by clinical trials, an “efficacy-effectiveness gap” that pervades medicine (Eichler et al., 2011). Pharmacological effects can lead to huge benefits for some individuals, be barely noticeable for others, and for a few even cause a net negative impact through adverse drug reactions (ADRs). Problems with the external validity of randomised controlled trials, diverse healthcare and drug use practices, or patient-level variation in drug response are all likely contributors to the gap (Groenwold, 2021). In psychiatry, where “treatment resistant” symptoms affect a large proportion of patients (Howes et al., 2022), these issues have been systematically raised and examined. While there is no evidence that common psychotropics or even psychotherapy interventions are less efficacious than drugs prescribed for non-psychiatric conditions (Leucht et al., 2012; Huhn et al., 2014), the development and refinement of psychiatric drugs is notoriously slow compared to other fields (Nutt, 2025), partly because many mechanisms of action involved in psychopharmacology and their precise effect on disease processes and neurobiology remain unclear (Huda, 2019; Howes et al., 2022).

Substantial efforts in psychiatric research are dedicated to more accurately predicting treatment response to current drugs, with aims of eventually lessening the efficacy-effectiveness gap (Dellen, 2024). One route to accomplishing this task is stratified medicine or “precision psychiatry”, which involves identifying patient subgroups with respect to their characteristics or response to drugs (Bell, 2014). While a myriad of factors (e.g., environmental, physiological, genomic) are known to affect treatment response in psychiatry (Stern et al., 2018), genetic variation is of particularly strong interest for developing stratified approaches as it is identifiable and stable from birth. Which genetic variants affect response to drugs, and whether they influence pharmacokinetic or pharmacodynamic processes, is the topic of study of pharmacogenomics (Pirmohamed and Park, 2001). Advances in this field have led to algorithms, developed by expert groups (Klein and Ritchie, 2018) or industry (Behera et al., 2025), that can inform screening for haplotypes known to influence the activity of drug metabolising enzymes (classically termed “star alleles”), and infer how carriers might respond to a given drug. While the research sustaining the psychiatric arm of this discipline has seen a large growth in activities in recent years, and an increasing number of prospective trials are being funded, most promising results are still confined to the scientific literature and have not yet been translated into clinical interventions (Bousman et al., 2023a).

Translational efforts need to be based on robust research evidence, and pharmacogenomics has a number of international expert consortia routinely assessing any pharmacogenomic reports linked to licensed drugs (Whirl-Carrillo et al., 2021). Indeed, for many drug-gene pairs, pharmacogenomic effects have been investigated broadly, from simple molecular processes to complex patient-reported outcomes. While any of these reports could be used by regulators in deciding whether to recommend an implementation of pharmacogenomic testing (Wu, 2015), genetic evidence related to pharmacodynamic phenotypes such as drug response and ADRs tends to be considered the most likely to lead to a clinically useful and cost-effective intervention (Hughes, 2018). 

This perception is worth emphasising. In psychiatry, robust associations of pharmacogenomic variants with pharmacodynamic outcomes are rare, and pharmacogenomic guidelines for psychotropics are mostly based on studies of drug metabolism and other indicators of drug pharmacokinetics (Bousman et al., 2020). A potential explanation for this asymmetry is that, outside of severe ADRs, pharmacodynamic phenotypes seem akin to complex traits. They are multifactorial, polygenic, and require large samples for accurately estimating genetic effects, given these are often weak (Roden et al., 2019). In contrast, pharmacokinetic phenotypes seem to fit oligogenic inheritances with moderate-to-high heritabilities, and are therefore more tractable for genetic discovery studies (Roden et al., 2006; Ingelman-Sundberg and Molden, 2025). This echoes classic discussions in psychiatry about the use of “endophenotypes”: quantitative measures of biological processes relevant to psychiatric disorders that show stronger associations with genetic variants than the disorders themselves (Gottesman and Gould, 2003). Endophenotypes are meant to be surrogates of some of the elements that characterise multifactorial disorders, in the same way that pharmacokinetic processes are important drivers of pharmacodynamics, but not the only ones (Simon and von Fabeck, 2025). This implies the expectation that the effects of any given genetic variant are largest on phenotypes that closely reflect the biological processes that it directly causes or moderates. On the other hand, effect sizes become diluted as phenotypes move further away from basic molecular mechanisms and become influenced by other factors, genetic and otherwise.

In this paper, we aim to quantify effects of pharmacogenomic variation through this framework, initially postulated in research on metabolic control (Kacser and Burns, 1981). Borrowing from the “proximal-distal continuum” concept of health outcomes research (Brenner et al. 1995), we term “proximal outcomes” as those based on quantitative biological measures, which tend to be mechanistically closer to genetic variation. On the other end, “distal outcomes” are those usually captured by clinical phenotyping, being often further away from any single genetic effect and subject to multifactorial influences. We implemented this classification on a series of meta-analyses of pharmacogenomics reports focused on enzymes important to the metabolism of antidepressant and antipsychotic drugs (i.e., the cytochrome P450, or CYP, family of enzymes). While this literature is necessarily heterogeneous, investigating many drugs, enzymes, and outcomes, our aim was to curate a corpus of data that can be used for diverse applications, including the design and interpretation of psychiatric pharmacogenomic studies. If indeed genetic effects differ between proximal and distal outcomes, identifying even a wide range of plausible effect sizes for each category could assist with accurately estimating the statistical power of future basic and translational research (Huang et al., 2020), as well as flagging potential errors or biases in existing studies (Gelman and Carlin, 2014). 


<br>
<br>
<br>
<br>

## <strong> Methods </strong> 
### Methods

#### Literature Search

We searched PUBMED, Cochrane, and SCOPUS databases for literature published between 1996 (when standardised pharmacogenomic nomenclature was introduced) and November 2024. Briefly, the search looked across titles for the following key terms in the format [pharmacogenomic term] AND [drug term] AND [outcome term] AND NOT [‘review’ / ‘guidelines’]. The full list of search terms is found in the **Supplementary Materials**. Records returned from the three databases were combined, and duplicate entries were removed (**Figure 1**). 

<br>

#### Study Selection

We compiled studies investigating associations of genotype-based pharmacogenomic variables with a range of outcomes in individuals taking psychiatric drugs. Broadly, these outcomes included measures of drug or metabolite bioavailability or clearance, drug doses, and measures of clinical response or ADRs (**Table 1**). We focussed on pharmacogenomic variation (i.e., genetics-inferred metabolism phenotypes, pharmacogenomic star alleles) in the CYP family of proteins given their role in the metabolism of many widely prescribed drugs (Zhao et al., 2021), including most psychotropics (Spina and de Leon, 2015). 

Titles and abstracts were screened first to determine eligibility based on fit to the research topic of this study. For reports passing this screening, we retrieved the full text and supplementary material if available. After full text inspection, we included reports in our analyses that were (i) original research articles, (ii) in English language, or able to be translated without ambiguities by the authors, (iii) were methodologically relevant, (iv) investigated an outcome, enzyme, or drug of interest, and (v) contained sufficient information to extract or infer effect sizes (see “Statistical Analysis”). We excluded studies conducted *in vitro*, using population modelling, or investigating drug-drug interactions. Studies in which pharmacogenomic information was not used (i.e., phenotyping by probe drug) or those investigating combinatorial metabolism phenotypes were also excluded. Where effect size information was shown graphically but was not explicitly mentioned in the report text, it was extracted from plots using a free online application (PlotDigitizer: Version 3.1.6, 2025). Finally, we also examined the reference lists of included studies for any relevant work that might have been missed by the initial literature search and screened these references as above (**Figure 1**).


```{r fig 1, fig.align='center', out.width="80%", fig.cap= "Figure 1. Flowchart showing the number of records identified from the literature search, the numbers following screening, retrieval, and finally, the number of records included in the final analysis. Flowchart template was adapted from the Preferred Reporting Items for Systematic reviews and Meta-Analyses (PRISMA; Moher et al. 2010)."}

knitr::include_graphics("Writing/figs/PRISMA Fig 1.png")
```

<br>

#### Statistical Analysis

Data were analysed in R v4.4.0 in R Studio 2024.04.0 Build 735 (R Core Team, 2021). Based on the information available in the eligible reports, we derived standardised mean differences (SMDs). In the context of this study, SMDs refer to the difference in effect between a group of individuals with an atypical CYP metabolism phenotype versus a normal metabolism phenotype. We also extracted SMDs for the effects of individual pharmacogenomic variants against wild-type alleles when these were reported. To calculate SMDs, group means and standard deviations were the preferred inputs. Where median and (interquartile) ranges were reported, approximate means and standard deviations were calculated using methods outlined by Wan et al. (2014). These were converted to SMDs using the *esc* ‘effect size conversion’ R package (Lüdecke, 2018). Other data reported (e.g., number of observations, Odds Ratios, and t statistics, in order of preference) were converted using the *esc* package. Full information about these calculations is provided in the **Supplementary Materials**. 

Additional details that were extracted from each report included: authors, year of publication, drug, enzyme, assessed outcome, and pharmacogenomic information. Where possible, pharmacogenomic information was extracted as metabolism phenotypes, or alternatively converted to them using on PharmGKB and CPIC reference tables (**Supplementary Materials**). When conversion was not possible, information was left in the same format as reported. For classifying outcomes, a binary variable was created, as described in **Table 1**. In summary, pharmacokinetic outcomes (e.g., relating to bioavailability or clearance of a drug or metabolite) were rated as “proximal”. Outcomes were alternatively labelled “distal” if they related to pharmacodynamics or potential consequences of altered metabolism; these included, for example, reports of drug doses, experiences of adverse drug reactions (ADRs), or ratings of symptom severity.  

| **Proximal Outcomes**                                                           | **Distal Outcomes**                                                                                    |
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Active moiety pharmacokinetics (e.g., concentration, half-life, clearance, AUC) | Adverse Drug Reactions                                                                                 |
| Drug pharmacokinetics (e.g., concentration, half-life, clearance, AUC)          | Drug dose                                                                                              |
| Metabolite pharmacokinetics (e.g., concentration, half-life, clearance, AUC)    | Treatment outcomes (e.g., remission, hospitalisation, treatment discontinuation, medication switching) |
| Metabolic ratios                                                                | Symptom severity                                                                                       |
Table 1. Examples of phenotypes included in the meta-analyses and whether they were rated as proximal or distal outcomes.


```{r create subgroup datasets}
# only risperidone
ris_smd <- dplyr::filter(all_smd, drug_id == "risperidone" & enzyme == "CYP2D6") # n = 415

# only escitalopram 
esc_smd <- dplyr::filter(all_smd, drug_id == "escitalopram" & enzyme == "CYP2C19") # n = 218

# only aripiprazole
ari_smd <- dplyr::filter(all_smd, drug_id == "aripiprazole" & enzyme == "CYP2D6") # n = 123

# only haloperidol
hal_smd <- dplyr::filter(all_smd, drug_id == "haloperidol" & enzyme == "CYP2D6") # n = 103
```

Our primary analysis utilised the full set of calculated effect sizes. To account for heterogeneity between drugs, enzymes, and pharmacogenomic measures analysed, we used absolute effect sizes as the outcome variable, and the outcome binary rating (i.e., proximal/distal) as the moderator variable. We included a random intercept for effect size ID, and study ID, and a random slope for the moderator, with an unstructured variance-covariance matrix. As a sensitivity analysis, we repeated the primary meta-analysis on gene-drug subgroups to determine whether findings relating to proximal and distal effect sizes were replicable across subsets of the data. Gene-drug pairings with at least one hundred effect sizes were selected, including CYP2D6-risperidone (N = `r nrow(ris_smd)`), CYP2C19-escitalopram (N =  `r nrow(esc_smd)`), CYP2D6-aripiprazole (N = `r nrow(ari_smd)`), and CYP2D6-haloperidol (N = `r nrow(hal_smd)`). For these analyses, we used a simplified random effects structure of effect size ID nested within study ID.

As a secondary analysis, we tested for whether the outcome phenotype (“proximal” or “distal”) influenced the effects of genetics-inferred enzyme activity across distinct metabolism phenotypes. This analysis included only effect sizes for which pharmacogenomic information was available as, or could be converted to, metabolism phenotypes. We extended the primary meta-analysis model to include an interaction term between rating and metabolism phenotype as the moderators, keeping the same random-effects structure. Comparisons between estimates of metaboliser phenotype effect sizes were performed using Wald-type tests. Holm’s method was used to correct for multiple comparisons. 

We used *metafor* (Viechtbauer, 2010) to fit multi-level, multivariate meta-analyses. In all analyses, we used a three-level correlated and hierarchical effects model. To account for dependency in our data, we imputed a variance-covariance matrix in *metafor* with positive correlations between clusters of effects (ρ = 0.6). We also performed robust variance estimation based on the *clubSandwich* package (Pustejovsky, 2024) to further account for this dependency via a sandwich estimator with bias reduced-linearisation for small-sample correction. We tested models using different random effect structures, alongside different parameters of ρ to assess how these affected our analysis, also using profile likelihood plots to assess parameter identifiability and potential model over-parametrisation (see *Supplementary Materials*). We fit two meta-analyses, one without the intercept to attain effect estimates for both proximal and distal outcomes, and one with an intercept to test whether proximal and distal effect estimates are significantly different. Finally, due to concerns that assessing traditional funnel plots using the SMD can lead to false positives when checking for publication bias, we additionally plot the SMD against 1/√N (Zwetsloot et al., 2017). We formally tested for publication bias using an adjusted version of Egger’s Test that accounts for the multi-level nature of the data, also using 1/√N in place of the standard error moderator (Rodgers and Pustejovsky, 2021).  

<br>

#### Applications

We conducted power analyses using *pwr* (Champely, 2020) to assess how sample sizes required to attain 80% power in pharmacogenomics research vary depending on the phenotype assessed. Effect sizes used were the proximal and distal effect estimates obtained from the primary meta-analysis and their robust 95% confidence intervals. 

We also used the SMDs generated as part of this meta-analysis to model the potential inflation  across effect sizes for proximal and distal outcomes (i.e., winner’s curse; Zöllner and Pritchard 2007). As described in the **Supplementary Material**, results from these models can be used as prior distributions to generate posterior bias-reduced estimates of pharmacogenomic effects in existing and future analyses.

Finally, we developed an interactive dashboard allowing users to filter, browse, visualise, and download data collected for this meta-analysis. This allows interested readers to access the effect size data in a user-friendly manner, alongside acting as a resource to help researchers to plan their future studies into pharmacogenomic variation and psychiatric medicine through a basic power calculation. The dashboard also allows users to fit three-level correlated and hierarchical effects meta-analyses on the filtered data to allow for an initial assessment of the pooled effect sizes for genes, drugs, and enzymes of interest. The dashboard was built using the R *shiny* package (Chang et al., 2025). 


<br>
<br>
<br>
<br>


## <strong> Results </strong> 
### Results

This meta-analysis was performed in line with the Preferred Reporting Items for Systematic reviews and Meta-Analyses (PRISMA; Moher et al. 2010) guidelines (**Supplemental Materials**). **Figure 1** describes how the final list of studies was ascertained. 

Briefly, we identified and screened for eligibility 6,129 entries from the literature search, of which 386 full texts were selected to be assessed for inclusion. Following this, we identified an additional 257 records from citation searching, of which 168 were selected to have full texts assessed for inclusion. In total, we calculated `r nrow(og)` effect sizes for `r length(unique(og$Study))` studies (N = `r nrow(filter(l1, Extracted == 1))` from the literature search; N = `r nrow(filter(l2, Extracted == 1))` from citation searching).  After excluding extreme values (SMD >= 5 or SMD <= -5), `r nrow(all_smd)` effect sizes from `r length(unique(all_smd$Study))` studies remained. 

Over half (`r round((nrow(filter(all_smd, geo == "Europe")) / nrow(all_smd)) * 100)`%) of analyses were performed on samples recruited in European countries, with the next largest group (`r round((nrow(filter(all_smd, geo == "Asia")) / nrow(all_smd)) * 100)`%) coming from Asian countries. The most frequently studied drugs were risperidone (`r round((nrow(filter(all_smd, drug_id == "risperidone")) / nrow(all_smd)) * 100)`%) and escitalopram (`r round((nrow(filter(all_smd, drug_id == "escitalopram")) / nrow(all_smd)) * 100)`%). The most studied enzymes were CYP2D6 (`r round((nrow(filter(all_smd, enzyme == "CYP2D6")) / nrow(all_smd)) * 100)`%) and CYP2C19 (`r round((nrow(filter(all_smd, enzyme == "CYP2C19")) / nrow(all_smd)) * 100)`%). There were similar numbers of proximal (`r round((nrow(filter(all_smd, pdr == 1)) / nrow(all_smd)) * 100)`%) and distal (`r round((nrow(filter(all_smd, pdr == 2)) / nrow(all_smd)) * 100)`%) outcomes across the analyses. A full description of the dataset is found in **Table 2**, below.


```{r descriptive table 2 v2}
pt1 <- tbl_summary(include = c(rating, geo, drug_type, enzyme_type, mp), data = all_smd, 
                 statistic = list(all_categorical() ~ "{n} ({p}%)"), digits =  all_continuous() ~ 1, 
                 label = list(rating ~ "Outcome", geo ~ "Continent", drug_type ~ "Drug Studied", enzyme_type ~ "Enzyme Studied", mp ~ "Metabolism Phenotype")) %>%
  modify_header(label = "Variable", stat_0 = "N (effect sizes) (%)") 

pt1 <-as.data.frame(pt1)

# outcome
df <- all_smd %>% filter(rating=="Proximal")
a1 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(rating=="Distal")
a2 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
#pad <- c(NA,NA,NA,NA)
out1 <- rbind(a1, a2)
out1$Variable <- c("Proximal", "Distal")
out1$nsp <- round(c((out1$ns[1]/sum(out1$ns)*100), (out1$ns[2]/sum(out1$ns)*100)),2)

# continent
df <- all_smd %>% filter(geo=="Asia")
a1 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(geo=="Europe")
a2 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(geo=="Mixed")
a3 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(geo=="North America")
a4 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(geo=="Oceania")
a5 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(geo=="South America")
a6 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(geo=="Africa")
a7 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)

#pad <- c(NA,NA,NA,NA)
out2 <- rbind(a1,a2,a3,a4,a5,a6,a7)
out2$Variable <- c("Asia", "Europe", "Mixed", "North America", "Oceania","South America", "Africa")
out2$nsp <- round(c((out2$ns[1]/sum(out2$ns)*100), (out2$ns[2]/sum(out2$ns)*100), (out2$ns[3]/sum(out2$ns)*100), (out2$ns[4]/sum(out2$ns)*100), (out2$ns[5]/sum(out2$ns)*100), (out2$ns[6]/sum(out2$ns)*100), (out2$ns[7]/sum(out2$ns)*100)), 2)

# drug studied
df <- all_smd %>% filter(drug_type=="Antidepressant")
a1 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(drug_type=="Antipsychotic")
a2 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(drug_type=="Unknown/Multiple")
a3 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
#pad <- c(NA,NA,NA,NA)
out3 <- rbind(a1, a2,a3)
out3$Variable <- c("Antidepressant", "Antipsychotic", "Unknown/Multiple")
out3$nsp <- round(c((out3$ns[1]/sum(out3$ns)*100), (out3$ns[2]/sum(out3$ns)*100), (out3$ns[3]/sum(out3$ns)*100)), 2)

# enzyme studied
df <- all_smd %>% filter(enzyme_type=="CYP1A2")
a1 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(enzyme_type=="CYP2B6")
a2 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(enzyme_type=="CYP2C9")
a3 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(enzyme_type=="CYP2C19")
a4 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(enzyme_type=="CYP2D6")
a5 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(enzyme_type=="CYP3A4/5")
a6 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)

out4 <- rbind(a1,a2,a3,a4,a5,a6)
out4$Variable <- c("CYP1A2", "CYP2B6", "CYP2C9", "CYP2C19", "CYP2D6","CYP3A4/5")
out4$nsp <- round(c((out4$ns[1]/sum(out4$ns)*100), (out4$ns[2]/sum(out4$ns)*100), (out4$ns[3]/sum(out4$ns)*100), (out4$ns[4]/sum(out4$ns)*100), (out4$ns[5]/sum(out4$ns)*100), (out4$ns[6]/sum(out4$ns)*100)), 2)

# metabolism phenotype
df <- all_smd %>% filter(mp=="IM")
a1 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(mp=="PM")
a2 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(mp=="RM")
a3 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(mp=="UM")
a4 <- data.frame(mean_smd  = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)
df <- all_smd %>% filter(is.na(mp))
a5 <- data.frame(mean_smd = mean(df$SMD, na.rm = T), mean_abs = mean(df$absmd, na.rm = T), ns = length(unique(df$Study)), nk = nrow(df)) %>% round(digits = 3)

out5 <- rbind(a1,a2,a3,a4,a5)
out5$Variable <- c("Intermediate", "Poor", "Rapid", "Ultra-rapid", "Unknown")
out5$nsp <- round(c((out5$ns[1]/sum(out5$ns)*100), (out5$ns[2]/sum(out5$ns)*100), (out5$ns[3]/sum(out5$ns)*100), (out5$ns[4]/sum(out5$ns)*100), (out5$ns[5]/sum(out5$ns)*100)), 2)

pt2 <- rbind(out1,out2,out3,out4, out5)
pt2$n_sp <- paste0(pt2$ns, " (", pt2$nsp,")")
pt2 <- dplyr::select(pt2, c("Variable", "n_sp", "mean_smd", "mean_abs"))

out <- left_join(pt1, pt2, by = "Variable")
colnames(out) <- c("Variable", "N (effect sizes) (%)", "N (studies) (%)", "Mean SMD", "Mean abs(SMD)")


kbl(out, caption = "
Table 2. Descriptive information about the analyses included in the effect size data. For each variable, number of studies and effect sizes are reported . The mean of the Standardised Mean Difference (SMD) and absolute Standardised Mean Difference (abs(SMD)) for each group are also given." ) %>% kable_paper(bootstrap_options = "striped", full_width = F) %>%
  add_indent(c(2:3,5:11,13:15,17:22,24:28))


     # gt::tab_options(table.background.color = "#EFEFEF")  %>% modify_caption("")
```

<br>
<br>

#### Meta-Analysis of Proximal and Distal Outcomes

```{r main analysis}
# calculate the vcov matrix
V <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = all_smd)

# fit correlated and hierarchical effects model
meta.all <- rma.mv(absmd ~ 0 + rating, 
                    V = V,
                    random = list(~ rating | Study, ~ 1 | es_id), struct = "UN",
                    method = "REML", test = "t", dfs = 'contain',
                    data = all_smd,
                    sparse = TRUE)

meta.all <- robust(meta.all, cluster = Study, adjust = "CR2", clubSandwich = T)

out.all <- data.frame(Outcome = c("Proximal", "Distal"),
                      Estimate = c(meta.all$b[1], meta.all$b[2]),
                      SE = c(meta.all$se[1], meta.all$se[2]),
                      'p value' = c(meta.all$pval[1], meta.all$pval[2])
                      )
                
# difference 
meta.all.i <- rma.mv(absmd ~ rating, 
                    V = V,
                    random = list(~ rating | Study, ~ 1 | es_id), struct = "UN",
                    method = "REML", test = "t", dfs = 'contain',
                    data = all_smd,
                    sparse = TRUE)


meta.all.i <- robust(meta.all.i, cluster = Study, adjust = "CR2", clubSandwich = T)
```

As shown in **Figure 2**, we found evidence for a significant effect of pharmacogenomic variation on proximal (β = `r round(meta.all$beta[1], 3)` [95% CI `r round(meta.all$ci.lb[1], 3)` – `r round(meta.all$ci.ub[1], 3)`], *p* = `r format_p(meta.all$pval[1])`) and distal outcomes (β = `r round(meta.all$beta[2], 3)` [95% CI `r round(meta.all$ci.lb[2], 3)` – `r round(meta.all$ci.ub[2], 3)`], *p* = `r format_p(meta.all$pval[2])`). The intercept model showed that the proximal effect size was indeed significantly larger than the distal effect estimate (Δβ = `r round(meta.all.i$beta[2], 3)` [95% CI `r round(meta.all.i$ci.lb[2], 3)` – `r round(meta.all.i$ci.ub[2], 3)`], *p* = `r format_p(meta.all.i$pval[2])`). Most of the variance in our dataset was at a within-study level(σ^2^ = `r round(meta.all$sigma2, 3)`). Between-study variance was larger for proximal outcomes (τ^2^ = `r round(meta.all$tau2[1], 3)`), than for distal outcomes (τ^2^ = `r round(meta.all$tau2[2], 3)`).

<br> 

```{r main analysis plot, warning = FALSE, echo=FALSE, message=FALSE, results='hide', fig.align='center', fig.cap="Figure 2. Orchard plot (Nakagawa et al., 2021) showing the distribution of effect sizes (Standardised Mean Difference, SMD) across proximal and distal outcomes. Size of points is determined by a sample-size based measure of precision (1/√N). Pooled estimates for proximal and distal effect sizes are represented by the black diamond, with error bars representing robust 95% confidence intervals (thick) and 95% prediction intervals (thin); see IntHout et al., (2016) for more information. Number of effect sizes is represented by k, with number of studies in brackets. Note that while an absolute scale was used for the effect sizes included in the meta-analysis, we used the standard procedures for calculating prediction intervals, in which the lower bound is not limited at zero."}

meta.res.all <- orchaRd::mod_results(meta.all, mod = "rating", group = "Study", N = "Total_N" )
custom_orchard_plot(meta.res.all, mod = "ratings", group = "Study", xlab = "Standardised mean difference", N = "Total_N",
                        k.pos = "right", branch.size = 2, trunk.size = 1, twig.size = 1, alpha = .2) +
  scale_color_manual(values = c( "#e4959a", "#43919c")) + 
  scale_fill_manual(values = c( "#e4959a", "#43919c")) + 
    annotate("text", label = paste0("Robust 95% Confidence Intervals [", round(meta.all$ci.lb, 3)[1], ", ",  round(meta.all$ci.ub, 3)[1], "]"), x = 0.95, y = 3.5) + 
    annotate("text", label = paste0("95% Prediction Intervals [", round(meta.res.all$mod_table$lowerPR, 3)[1], ", ",  round(meta.res.all$mod_table$upperPR, 3)[1], "]"), x = 0.87, y = 3.8) + 
      annotate("text", label = paste0("Robust 95% Confidence Intervals [", round(meta.all$ci.lb, 3)[2], ", ",  round(meta.all$ci.ub, 3)[2], "]"), x = 1.95, y = 3.5) +
      annotate("text", label = paste0("95% Prediction Intervals [", round(meta.res.all$mod_table$lowerPR, 3)[2], ", ",  round(meta.res.all$mod_table$upperPR, 3)[2], "]"), x = 1.87, y = 3.8) +
      theme(axis.title = element_text(colour = "#474044", size = 14),
            axis.text.x = element_text(colour = "#474044", size = 11),
            axis.text.y = element_text(colour = "#474044", size = 11, hjust = 0.5),
            axis.ticks = element_line(colour = "#474044"),
            plot.title = element_text(colour = "#474044"),
            plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))

```

<br>
<br>

#### Sensitivity Analyses: Across Gene-Drug Pairings 

```{r all gene-drug subgrops analyses}
Vris <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = ris_smd)

# fit correlated and hierarchical effects model
meta.ris <- rma.mv(absmd ~ 1 + rating, 
                    V = Vris,
                    random = list(~ 1 | Study / es_id),
                    method = "REML", test = "t", dfs = 'contain',
                    data = ris_smd,
                    sparse = TRUE)

meta.ris <- robust(meta.ris, cluster = Study, adjust = "CR2", clubSandwich = T)

Vesc <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = esc_smd)

# fit correlated and hierarchical effects model
meta.esc <- rma.mv(absmd ~ 1 + rating, 
                    V = Vesc,
                    random = list(~ 1 | Study / es_id),                   
                    method = "REML", test = "t", dfs = 'contain',
                    data = esc_smd,
                    sparse = TRUE)

meta.esc <- robust(meta.esc, cluster = Study, adjust = "CR2", clubSandwich = T)

Vari <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = ari_smd)

# fit correlated and hierarchical effects model
meta.ari <- rma.mv(absmd ~ 1 + rating, 
                    V = Vari,
                    random = list(~ 1 | Study / es_id),                   
                    method = "REML", test = "t", dfs = 'contain',
                    data = ari_smd,
                    sparse = TRUE)

meta.ari <- robust(meta.ari, cluster = Study, adjust = "CR2", clubSandwich = T)

Vhal <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = hal_smd)

# fit correlated and hierarchical effects model
meta.hal <- rma.mv(absmd ~ 1 + rating, 
                    V = Vhal,
                    random = list(~ 1 | Study / es_id),
                    method = "REML", test = "t", dfs = 'contain',
                    data = hal_smd,
                    sparse = TRUE)

meta.hal <- robust(meta.hal, cluster = Study, adjust = "CR2", clubSandwich = T)

```

We repeated the primary analysis in subgroups restricted to the most common gene-drug pairings (i.e., those with at least 100 analyses available). We observed that proximal effect sizes were significantly larger than distal effect sizes in the Risperidone-CYP2D6 group (Δβ = `r round(meta.ris$beta[2], 3)` [95% CI `r round(meta.ris$ci.lb[2], 3)` – `r round(meta.ris$ci.ub[2], 3)`], *p* = `r format_p(meta.ris$pval[2])`) and the Aripiprazole-CYP2D6 group (Δβ = `r round(meta.ari$beta[2], 3)` [95% CI `r round(meta.ari$ci.lb[2], 3)` – `r round(meta.ari$ci.ub[2], 3)`], *p* = `r format_p(meta.ari$pval[2])`). After applying robust variance estimation, we did not observe a significant difference between the effect sizes in the haloperidol-CYP2D6 group (Δβ = `r round(meta.hal$beta[2], 3)` [95% CI `r round(meta.hal$ci.lb[2], 3)` – `r round(meta.hal$ci.ub[2], 3)`], *p* = `r format_p(meta.hal$pval[2])`) and the escitalopram-CYP2C19 group (Δβ = `r round(meta.esc$beta[2], 3)` [95% CI `r round(meta.esc$ci.lb[2], 3)` – `r round(meta.esc$ci.ub[2], 3)`], *p* = `r format_p(meta.esc$pval[2])`). However, the directions of all effects were consistent with the primary analysis. 

<br>
<br>

#### Secondary Analyses: Differences Across Metabolism Phenotypes

```{r create dataset 1}
meta.dat.all <- all_smd %>% drop_na(mp) %>% drop_na(rating) %>% drop_na(enzyme)
```


```{r interaction 1, warning = FALSE, fig.align='center'}
V <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = meta.dat.all)

meta.int <- rma.mv(absmd ~ 0 + rating:mp, 
                        V = V,
                        random = list(~ rating | Study, ~ 1 | es_id), struct = c("UN"),
                        method = "REML", test = "t", dfs = 'contain',
                        data = meta.dat.all,
                        sparse = TRUE)


meta.int <- robust(meta.int, cluster = Study, adjust = "CR2", clubSandwich = T)

``` 


```{r comparison 1a (P vs D)}
a <- anova(meta.int, X=rbind(c(0,0,-1,1,0,0,0,0), c(-1,1,0,0,0,0,0,0), c(0,0,0,0,-1,1,0,0),c(0,0,0,0,0,0,-1,1)))

res <- data.frame(Test = a$hyp,
                  Estimate = a$Xb,
                  SE = a$se,
                  pval = a$pval,
                  corrected = p.adjust(a$pval, method = "holm"))
```

We fit a meta-analysis restricted to effect sizes for which metabolism phenotype information was available. We tested for moderation effects via the addition of an outcome-metabolism phenotype interaction terms to the model, comparing the effect of an atypical metabolism phenotype (i.e., Poor, Intermediate, Rapid, or Ultrarapid) versus the normal metabolism phenotype for either proximal, or distal outcomes. We included `r nrow(meta.dat.all)` effect sizes from `r length(unique(meta.dat.all$Study))` different studies with results shown in **Figure 3** and **Supplemental Materials**.

We tested for differences between model estimates using Wald-type tests. Reported *p* values are corrected for multiple comparisons with Holm's method. Effect sizes for proximal outcomes were significantly larger than distal outcomes for the poor metabolism phenotype  (β = `r round(res$Estimate[1],3)` (SE = `r round(res$SE[1],3)`), *p* = `r format_p(res$corrected[1])`) and the intermediate metabolism phenotype (β = `r round(res$Estimate[2],3)` (SE = `r round(res$SE[2],3)`), *p* = `r format_p(res$corrected[2])`). There was no significant difference between proximal and distal estimates for both the rapid (β = `r round(res$Estimate[3],3)` (SE = `r round(res$SE[3],3)`), *p* = `r format_p(res$corrected[3])`) and ultrarapid (β = `r round(res$Estimate[4],3)` (SE = `r round(res$SE[4],3)`), *p* = `r format_p(res$corrected[4])`) metaboliser statuses. When assessing whether metabolism phenotypes had distinct effects within outcomes, we observed that the estimate for the poor metabolism phenotype was significantly different to all other phenotypes for proximal outcomes (**Table 3**). We also report that the effect size of an intermediate metabolism phenotype is significantly larger than that of a rapid metabolism phenotype. For distal outcomes, there were no significant differences between the effect estimates of metabolism phenotypes (**Table 4**).  As in the primary analysis, the largest variance component was at the within-study level (σ^2^ = `r round(meta.int$sigma2, 3)`), with greater between-study heterogeneity for proximal outcomes (τ^2^ = `r round(meta.int$tau2[1], 3)`) than distal outcomes (τ^2^ =  `r round(meta.int$tau2[2],3)`).

<br>
<br>

```{r summary plot 1, warning = FALSE, fig.align='center', fig.cap="Forest plot showing absolute effect sizes of pharmacogenomic metabolism phenotypes on proximal and distal outcomes. Point shows the effect estimates for proximal (pink) and distal (blue) outcomes, error bars show robust 95% confidence intervals. Effect estimates reflect that of an atypical metabolism phenotype (i.e., Poor, Intermediate, Rapid, or Ultrarapid) versus the normal metabolism phenotype for either proximal, or distal outcomes."}
pal <- c("#e4959a","#43919c")

plot_all <- data.frame(PDR = c("Proximal", "Distal", "Proximal", "Distal", "Proximal", "Distal", "Proximal", "Distal"),
                       mp = c("IM", "IM", "PM", "PM", "RM", "RM", "UM", "UM"),
                       Estimate = meta.int$beta,
                       SE = meta.int$se,
                       ci.low = meta.int$ci.lb,
                       ci.hi = meta.int$ci.ub
)

rownames(plot_all) <- NULL

plot_all$PDR <- factor(plot_all$PDR, levels = c("Proximal", "Distal"))
plot_all$mp <- factor(plot_all$mp, levels = c("PM", "IM", "RM", "UM"), labels = c("Poor Metaboliser", "Intermediate Metaboliser", "Rapid Metaboliser", "Ultrarapid Metaboliser"))

ggplot(data = plot_all, aes(x=mp, y=Estimate, ymin=ci.low, ymax=ci.hi,col=PDR,fill=PDR)) + 
#specify position here
  #geom_linerange(linewidth=5, position=position_dodge(width = 0.5)) +
   geom_hline(yintercept=0, lty=2) +
#specify position here too
  geom_point(size=3, shape=21, colour="white", stroke = 0.5, position=position_dodge(width = -0.5)) +
  geom_errorbar(aes(width=0.5), position=position_dodge(width = -0.5)) +
  scale_fill_manual(values=pal)+
  scale_color_manual(values=pal)+
  scale_y_continuous(name="Estimate", limits = c(-0.1, 1.5)) +
    labs(title='PGx Metabolism Phenotypes by Outcome Interaction') +
#  scale_x_discrete(limits = c("Poor Metaboliser", "Intermediate Metaboliser", "Rapid Metaboliser", "Ultrarapid Metaboliser")) +
  xlab("Metabolism Phenotype")+
  #geom_text(aes(label = label), nudge_x = 0.15, show.legend = FALSE) +
  coord_flip() +
  theme(legend.position = "bottom") +
  labs(colour = NULL, fill = NULL) +
  theme_minimal() + 
  theme(axis.title = element_text(colour = "#474044", size = 14),
            axis.text.x = element_text(colour = "#474044", size = 11),
            axis.text.y = element_text(colour = "#474044", size = 11, hjust = 0.5),
            axis.ticks = element_line(colour = "#474044"),
            plot.title = element_text(colour = "#474044"),
            plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))
  
```


<br>
<br>
```{r comparison 1b (P MP)}
a <- anova(meta.int, X=rbind(c(1,0,-1,0,0,0,0,0), c(0,0,-1,0,1,0,0,0), c(0,0,-1,0,0,0,-1,0), c(-1,0,0,0,1,0,0,0), c(-1,0,0,0,0,0,1,0), c(0,0,0,0,-1,0,1,0)))

res <- data.frame(Test = a$hyp,
                  Estimate = a$Xb,
                  SE = a$se,
                  pval = format_p(a$pval),
                  corrected = format_p(p.adjust(a$pval, method = "holm")))

# make the names more readable
res$Var.1 <- c("Intermediate Metaboliser - Poor Metaboliser", "Rapid Metaboliser - Poor Metaboliser", "Ultrarapid Metaboliser - Poor Metaboliser", "Rapid Metaboliser - Intermediate Metaboliser", "Ultrarapid Metaboliser - Intermediate Metaboliser", "Ultrarapid Metaboliser - Rapid Metaboliser")

DT::datatable(res, colnames = c("Tests of Equality of Effect Sizes (proximal outcomes)", "Estimate", "SE", "p value", "p value (Holm)"), rownames = FALSE, caption = "Table 3. Results of ANOVA comparing whether proximal effect sizes for two different metabolism phenotypes (shown in the test column) are significantly different from each other.", options = list(
  info = FALSE,
  paging = FALSE,
  searching = FALSE
)) %>% DT::formatRound(columns = c('Estimate', 'SE'), digits = 4)

```

<br>
<br>

```{r comparison 1c (D MP)}
a <- anova(meta.int, X=rbind(c(0,1,0,-1,0,0,0,0), c(0,0,0,-1,0,1,0,0), c(0,0,0,-1,0,0,0,1), c(0,-1,0,0,0,1,0,0), c(0,-1,0,0,0,0,0,1), c(0,0,0,0,0,-1,0,1)))

res <- data.frame(Test = a$hyp,
                  Estimate = a$Xb,
                  SE = a$se,
                  pval = format_p(a$pval),
                  corrected = format_p(p.adjust(a$pval, method = "holm")))


# make the names more readable
res$Var.1 <- c("Intermediate Metaboliser - Poor Metaboliser", "Rapid Metaboliser - Poor Metaboliser", "Ultrarapid Metaboliser - Poor Metaboliser", "Rapid Metaboliser - Intermediate Metaboliser", "Ultrarapid Metaboliser - Intermediate Metaboliser", "Ultrarapid Metaboliser - Rapid Metaboliser")

DT::datatable(res, colnames = c("Tests of Equality of Effect Sizes (distal outcomes)", "Estimate", "SE", "p value", "p value (Holm)"), rownames = FALSE, caption = "Table 4. Results of ANOVA comparing whether distal effect sizes for two different metabolism phenotypes (shown in the test column) are significantly different from each other.", options = list(
  info = FALSE,
  paging = FALSE,
  searching = FALSE
)) %>% DT::formatRound(columns = c('Estimate', 'SE', 'pval', 'corrected'), digits = 4)

```


<br> 
<br>


#### Applications

```{r proximal and distal with shaded, warnings = FALSE, message=FALSE, results='hide'}
# https://statsthinking21.github.io/statsthinking21-R-site/statistical-power-in-r.html

# PROXIMAL
effect_sizes <- c(0.2, 0.3, 0.4, 0.5, 0.6, 0.7, round(meta.all$ci.lb[1], 3), round(meta.all$beta[1],3), round(meta.all$ci.ub[1], 3)) 
sample_sizes = seq(10, 500, 10)

input_df <- crossing(effect_sizes,sample_sizes)

pn <- pwr.t.test(power = 0.8, d=meta.all$beta[1], type='two.sample')
pnl <- pwr.t.test(power = 0.8, d=meta.all$ci.lb[1], type='two.sample')
pnu <- pwr.t.test(power = 0.8, d=meta.all$ci.ub[1], type='two.sample')

# run get_power for each combination of effect size 
# and sample size

power_curves <- input_df %>%
  do(get_power(.)) 

power_curves$effect_sizes[power_curves$effect_sizes == round(meta.all$ci.lb[1], 3)] <- "95% CI (Lower)"
power_curves$effect_sizes[power_curves$effect_sizes == round(meta.all$beta[1],3)] <- "Effect Size (Proximal)"
power_curves$effect_sizes[power_curves$effect_sizes == round(meta.all$ci.ub[1], 3)] <- "95% CI (Upper)"


power_curves2 <- subset(power_curves, effect_sizes == "95% CI (Lower)" | effect_sizes == "95% CI (Upper)")
power_curves2w <- pivot_wider(power_curves2, names_from = "effect_sizes", values_from = power)
colnames(power_curves2w) <- c("sample_sizes", "power_min", "power_max")

power_curves <- power_curves %>%
  mutate(effect_sizes = as.factor(effect_sizes)) 

top_group <- power_curves %>% filter(effect_sizes == "Effect Size (Proximal)") %>% pull(effect_sizes)

power_curves3 <- power_curves %>% filter(effect_sizes != "95% CI (Lower)" & effect_sizes != "95% CI (Upper)" )

a <- ggplot() + 
  geom_ribbon(data = power_curves2w, aes(x = sample_sizes, ymin = power_min, ymax = power_max), fill = "darkred", alpha = 0.3) +
  geom_line(power_curves3, mapping = aes(x = sample_sizes, y = power, group = effect_sizes, linetype = effect_sizes, size = effect_sizes, color = effect_sizes)) + 
  scale_linetype_manual(values = c("Effect Size (Proximal)" = "solid", "0.2" = "dotted", "0.3" = "2828", "0.4" = "4848", "0.5" = "dashed", "0.6" = "longdash", "0.7" = "twodash")) +
  scale_size_manual(values = c("Effect Size (Proximal)" = 1.5, "0.2" = .5, "0.3" = .5, "0.4" = .5, "0.5" = .5, "0.6" = .5, "0.7" = .5)) +
  scale_color_manual(values = c("Effect Size (Proximal)" = "red",  "0.2" = "black","0.3" = "black", "0.4" = "black", "0.5" = "black", "0.6" = "black", "0.7" = "black")) +
  labs(title = "Power Curves for estimated n across Effect Sizes", subtitle = str_wrap(paste0("N given at effect size intervals (0.2 - 0.7) with Proximal effect estimate (",  round(pn$d,3), ") overlaid (shaded = 95% CI [", round(pnl$d,3), " - ", round(pnu$d,3), "])."))) + xlab("Sample Size") + ylab("Power") +
  geom_hline(aes(yintercept = 0.8),colour = "black" ) +
  #  guides(size = FALSE, linetype = FALSE) +
  theme_minimal() +
  theme(legend.title=element_blank(),
        axis.title = element_text(colour = "#474044", size = 14),
            axis.text.x = element_text(colour = "#474044", size = 11),
            axis.text.y = element_text(colour = "#474044", size = 11, hjust = 0.5),
            axis.ticks = element_line(colour = "#474044"),
            plot.title = element_text(colour = "#474044"),
                   plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))


# DISTAL
effect_sizes <- c(0.1,0.2, 0.3, 0.4, 0.5, round(meta.all$ci.lb[2], 3), round(meta.all$beta[2],3), round(meta.all$ci.ub[2], 3)) 
sample_sizes = seq(10, 500, 10)

input_df <- crossing(effect_sizes,sample_sizes)

dn <- pwr.t.test(power = 0.8, d=meta.all$beta[2], type='two.sample')
dnl <- pwr.t.test(power = 0.8, d=meta.all$ci.lb[2], type='two.sample')
dnu <- pwr.t.test(power = 0.8, d=meta.all$ci.ub[2], type='two.sample')

# run get_power for each combination of effect size 
# and sample size

power_curves <- input_df %>%
  do(get_power(.)) 

power_curves$effect_sizes[power_curves$effect_sizes == round(meta.all$ci.lb[2], 3)] <- "95% CI (Lower)"
power_curves$effect_sizes[power_curves$effect_sizes == round(meta.all$beta[2],3)] <- "Effect Size (Distal)"
power_curves$effect_sizes[power_curves$effect_sizes == round(meta.all$ci.ub[2], 3)] <- "95% CI (Upper)"


power_curves2 <- subset(power_curves, effect_sizes == "95% CI (Lower)" | effect_sizes == "95% CI (Upper)")
power_curves2w <- pivot_wider(power_curves2, names_from = "effect_sizes", values_from = power)
colnames(power_curves2w) <- c("sample_sizes", "power_min", "power_max")

power_curves <- power_curves %>%
  mutate(effect_sizes = as.factor(effect_sizes)) 

top_group <- power_curves %>% filter(effect_sizes == "Effect Size (Distal)") %>% pull(effect_sizes)

power_curves3 <- power_curves %>% filter(effect_sizes != "95% CI (Lower)" & effect_sizes != "95% CI (Upper)" )

b <- ggplot() + 
  geom_ribbon(data = power_curves2w, aes(x = sample_sizes, ymin = power_min, ymax = power_max), fill = "darkred", alpha = 0.3) +
  geom_line(power_curves3, mapping = aes(x = sample_sizes, y = power, group = effect_sizes, linetype = effect_sizes, size = effect_sizes, color = effect_sizes)) + 
  scale_linetype_manual(values = c("Effect Size (Distal)" = "solid", "0.1" = "dotted", "0.2" = "2828", "0.3" = "4848", "0.4" = "dashed", "0.5" = "longdash")) +
  scale_size_manual(values = c("Effect Size (Distal)" = 1.5, "0.1" = .5, "0.2" = .5, "0.3" = .5, "0.4" = .5, "0.5" = .5)) +
  scale_color_manual(values = c("Effect Size (Distal)" = "red",  "0.1" = "black","0.2" = "black", "0.3" = "black", "0.4" = "black", "0.5" = "black")) +
  labs(title = "Power Curves for estimated n across Effect Sizes", subtitle = str_wrap(paste0("N given at effect size intervals (0.1 - 0.5) with Distal effect estimate (",  round(dn$d,3), ") overlaid (shaded = 95% CI [", round(dnl$d,3), " - ", round(dnu$d,3), "])."))) + xlab("Sample Size") + ylab("Power") +
  geom_hline(aes(yintercept = 0.8),colour = "black" ) +
  # guides(size = FALSE, linetype = FALSE) +
  theme_minimal() +
    theme(legend.title=element_blank(),
        axis.title = element_text(colour = "#474044", size = 14),
            axis.text.x = element_text(colour = "#474044", size = 11),
            axis.text.y = element_text(colour = "#474044", size = 11, hjust = 0.5),
            axis.ticks = element_line(colour = "#474044"),
            plot.title = element_text(colour = "#474044"),
                   plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))

#ggarrange(a,b, labels = "AUTO")
```

Based on the effect sizes generated in the primary meta-analysis, across all drugs and genes assessed, we generated curves to visualise the relationship between sample size and statistical power in a hypothetical future study. These values are given as N per group for a two-sample *t*-test and are based on the average pharmacogenomic effect sizes estimated for proximal and distal outcomes (**Figure 4**).  For a proximal outcome, the optimum sample size for 80% power was estimated at `r ceiling(pn$n)` individuals per group (range: `r ceiling(pnu$n)` - `r ceiling(pnl$n)`).  For a distal outcome, the optimum sample size for 80% power was estimated `r ceiling(dn$n)` individuals per group (range: `r ceiling(dnu$n)` - `r ceiling(dnl$n)`). 


```{r proximal plot, fig.align='center', warnings = FALSE, message=FALSE, results='hide'}
a
```

```{r distal plot, fig.align='center', warnings = FALSE, message=FALSE, results='hide', fig.cap= "Plot shows power at a given effect size and sample size. Panels show power curves based on effect sizes generated for proximal (above) and distal (below) effect sizes (and robust 95% CI) from the primary meta-analysis."}
b
```

<br>
<br> 

Similarly, the Bayesian analysis supports a larger shrinkage factor across most of the z-score distribution for distal outcomes (mean = 1.97) than for proximal outcomes (mean = 1.28). Assuming equal unadjusted effect sizes, this suggests that posterior estimates for distal outcomes will be smaller than that for proximal outcomes in most cases (**Supplemental materials**). Finally, we developed a companion Shiny App allowing for the visualisation of effect size distributions and power curves. We also included the ability for users to perform their own exploratory meta-analyses using the full dataset, or filtered to whichever enzyme, drug, and outcome combinations desired. This also generates probability distributions based on the filtered data and a calculator for estimating posterior effect sizes that account for winner’s curse.

<br>
<br>
<br>
<br>

## <strong> Discussion </strong>

```{r sample size check}
prox <- all_smd %>% filter(rating == "Proximal")
prox2 <- filter(prox, Total_N <= (ceiling(pn$n)*2))
res1 <- (nrow(prox2)/nrow(prox)*100)

dist <- all_smd %>% filter(rating == "Distal")
dist2 <- filter(dist, Total_N <= (ceiling(dn$n)*2))
res2 <- (nrow(dist2)/nrow(dist)*100)

orp <- esc::convert_d2or(d = out.all$Estimate[1], se = out.all$SE[1])
ord <- esc::convert_d2or(d = out.all$Estimate[2], se = out.all$SE[2])
```
Discussion
Here, we assess and quantify the effect size of pharmacogenomic variation across a large spectrum of phenotypes related to psychiatric drugs. We report on 2,092 effect sizes from 184 studies, demonstrating larger effects of pharmacogenomic variation on proximal outcomes than on distal outcomes. We showcase how the collected corpus of studies can be used to inform future pharmacogenomics research and study design and provide an interactive web app for browsing the raw data, facilitating the reproduction of our analyses or their adaptation to outcomes or drugs of specific interest for other researchers. 

Our primary finding was that, as expected, the effect for pharmacogenomic variation on proximal outcomes was significantly greater than that for distal outcomes. This generalises previous observations made in drug-gene guidelines about strong genetic effects on pharmacokinetics translating into weaker or unclear effects on clinical outcomes (Bousman et al., 2023b; Duarte et al., 2024). The difference in effect sizes between proximal and distal outcomes was consistent in all sensitivity analyses we made on each of the most common gene-drug subgroups in the psychiatric literature and significant in half of them, suggesting that our results are not driven by heterogeneity in the drugs or enzyme systems captured by our broad literature review. Furthermore, our analysis provides a rationale for the lack of pharmacodynamic primary evidence observed in psychiatric pharmacogenomic guidelines (Bousman et al., 2020), and supports that pharmacogenomic studies might see benefits in explicitly assessing how their phenotypes map to a “proximal-distal continuum” (Brenner et al., 1995) of genetic effects. Ideally, studies should also consider multiple outcomes relevant to clinical practice when possible, as recommended previously (Guchelaar et al., 2025). 

Currently, the translation of pharmacogenomics research to clinical recommendations is primarily informed by strength of evidence ratings written into drug-gene guidelines. As an example, the five-step variant scoring system employed by PharmGKB to standardise reports includes evidence ratings by phenotype, *p*-value, cohort size, study type, and effect size (Whirl-Carrillo et al., 2021). In this calculation, the “phenotype” criteria gives a larger score to studies of drug efficacy, toxicity or dosage, while the “effect size” category increases the weight of an association if a threshold of magnitude is passed (OR >= 2, OR =< 0.5). Our results suggest that these two ratings might effectively have opposing effects, as proximal associations tend to report larger effects (pooled OR = `r round(orp$es,1)`) more commonly than distal outcomes (pooled OR = `r round(ord$es,1)`). Therefore, as the size of the pharmacogenomics literature increases and the routine access of clinicians to genomic information draws near, specific pharmacogenomic weighting rules for different phenotypes or outcome classes might need to be added to the present scheme. As there is already an explicit aim of ensuring that analyses of clinically meaningful (often distal) outcomes form the basis of drug-gene guidelines when available, such a modification would ensure a fairer evaluation of their results on the evidence assessment process. 

We also investigated whether proximal-distal outcome differences in effect sizes existed across the functional spectrum of the enzymes included in our review. In these analyses we noted the distinction between estimates for proximal and distal outcomes were less consistent than in the primary analysis, with differences apparent only across the slower metabolism phenotypes (i.e., intermediate and poor). In particular, studies of poor versus normal metabolisers showed significantly larger effects than other atypical metabolism phenotypes, albeit only across proximal outcomes (**Figure 3**). These results suggest that greater care might be needed for defining metabolism phenotypes, particularly for those reflecting increased function. Furthermore, the fact that effect size estimates from ultra-rapid metabolisers versus normal metabolisers mostly overlap those of rapid and intermediate metabolisers for both proximal and distal outcomes supports that this phenotype might be particularly ill-defined in most studies. To this effect, it has already been shown that “normal” metabolisers of several enzymes have higher variability in pharmacokinetic measures when compared to atypical metabolisers identified by genetic testing, which might be attributed to the existence of functional alleles not currently assessed in pharmacogenomic studies (Lauschke et al., 2024). 

Our findings have applications beyond this study. First, we provide estimates for the expected effect sizes of psychiatric pharmacogenomics analyses, based on the type of phenotype investigated. These can inform data collection efforts for future research. As an illustration, our results suggest that if per-group sample sizes are collected aiming for an appropriately-powered analysis of a proximal phenotype (e.g. drug metabolism), they are likely to be substantially underpowered for assessing a distal outcome (e.g. treatment response). Second, a retrospective analysis of our dataset using outcome-specific calculations for 80% statistical power (**Figure 4**), shows that most analyses included in our review may indeed not reach this power threshold (`r round(res1, 1)`% proximal, `r round(res2, 1)`% distal). This suggests that barriers to participant recruitment, and potentially the availability of research funding, remain a limitation to psychiatric pharmacogenomics work (Pardiñas et al., 2021). Motivated by this finding, we conducted an estimation of the signal-to-noise ratio of past research in psychiatric pharmacogenomics using our collected studies, following the general procedure in van Zwet and Gelman (2022). The derived estimates allow for a Bayesian re-evaluation of the test statistics of comparable studies, accounting for the inflation in effect sizes that is often due to “Winner’s curse” (Zöllner and Pritchard, 2007). We provide a worked example of this methodology in the **Supplementary Material**, and implement all the relevant formulae to reproduce or replicate our calculations in a dedicated section of our Shiny app. 

One of the strengths of this research is the large number of studies and effects included in the meta-analysis. This was attained through broad but well-defined inclusion criteria, namely all analyses investigating pharmacogenomic variation in cytochrome P450 (CYP) genes in participants taking psychiatric drugs. Second, based on calls to improve transparency and reproducibility in meta-analytic research (Ahern et al., 2021), we developed a companion dashboard in R Shiny that enables users to browse, filter, and download the data used in the present meta-analysis. The application also allows users to perform exploratory meta-analyses of subgroups of the data, as well as power calculations based on these results. In such a rapidly evolving field, this is not intended to substitute future efforts to compile or curate the literature but does allow users to quickly assess reported effect sizes for arbitrary combinations of drugs, enzymes, and/or outcomes that might be of interest. 

A primary limitation of this research is the lack of studies identified from African and South American nations, excluding Brazil. Therefore, the results from this meta-analysis may not be generalisable to countries and participants in these locations. This needs to be taken into account as pharmacogenomic variation is known to differ across populations, in some instances quite dramatically (e.g., CYP3A4/5; Masimirembwa et al., 2014). However, consistent with a previous review (Popejoy, 2019), many studies did not report detailed ancestry information and so we were unable to statistically account for this. Another limitation derived from the assessed papers is that, while most studies used up-to-date nomenclature and metabolism phenotype definitions, several used criteria which are currently outdated. This has been corrected wherever possible, but it has not been feasible in all cases. Methodologically, visual inspection of funnel plots from the meta-analysis and results from the adapted Egger’s regression test are suggestive of funnel plot asymmetry. This has sometimes been argued as a consequence of publication bias and the inclusion of underpowered studies, but more complex factors could be at play (Afonso et al., 2024). Therefore, we made efforts to guard against potential biases in our effect size estimations by using correlated and hierarchical effects models with robust variance structures, as is best practice for datasets with potentially complex dependencies. A final limitation is that it is possible that measurement issues could partly explain our findings. Proximal outcomes such as drug pharmacokinetics and clearance can be physically measured and are thus generally easier to quantify than distal outcomes such as symptom severity. While ADRs and other distal clinical events (i.e. death) might also be easily and reliably assessed, if instruments of lower psychometric resolution are more common in distal outcomes research, this would also dilute genetic effects (Sluis et al., 2010). We are unable to account for this in our analysis as we do not have good estimates of the reliability or measurement error of all instruments involved, so our results should be considered with this caveat.

In summary, we found evidence of substantial variability in the magnitude of effect sizes reported by psychiatric pharmacogenomic studies, which we could relate to a simple phenotype classification involving either “proximal” or “distal” outcomes. We found evidence that this effect size disparity is apparent even when explicitly accounting for metabolism phenotype and is particularly pronounced for variation conferring slower enzyme activity. We have quantified these differences between proximal and distal effect sizes and provide ways in which future study design can be improved, for example via power calculations based on the results we compiled throughout our literature review. These findings may also have relevance for pharmacogenomics consortia, and future efforts focused on other drugs and disciplines of study might support new evaluations of the strength of evidence behind genotype-guided pharmacogenomic recommendations. 


<br>
<br>
<br>
<br>

## <strong> References </strong>
### References 

<br>

References
Afonso, J., Ramirez-Campillo, R., Clemente, F. M., Büttner, F. C., and Andrade, R. (2024). The Perils of Misinterpreting and Misusing “Publication Bias” in Meta-analyses: An Education Review on Funnel Plot-Based Methods. Sports Med 54, 257–269. doi: 10.1007/s40279-023-01927-9
Ahern, T. P., MacLehose, R. F., Haines, L., Cronin-Fenton, D. P., Damkier, P., Collin, L. J., et al. (2021). Improving the transparency of meta-analyses with interactive web applications. BMJ Evidence-Based Medicine 26, 327–332. doi: 10.1136/bmjebm-2019-111308
Behera, S., Catreux, S., Rossi, M., Truong, S., Huang, Z., Ruehle, M., et al. (2025). Comprehensive genome analysis and variant detection at scale using DRAGEN. Nat Biotechnol 43, 1177–1191. doi: 10.1038/s41587-024-02382-1
Bell, J. (2014). Stratified medicines: towards better treatment for disease. The Lancet 383, S3–S5. doi: 10.1016/S0140-6736(14)60115-X
Bousman, C. A., Bengesser, S. A., Aitchison, K. J., Amare, A. T., Aschauer, H., Baune, B. T., et al. (2020). Review and Consensus on Pharmacogenomic Testing in Psychiatry. Pharmacopsychiatry 54, 5–17. doi: 10.1055/a-1288-1061
Bousman, C. A., Maruf, A. A., Marques, D. F., Brown, L. C., and Müller, D. J. (2023a). The emergence, implementation, and future growth of pharmacogenomics in psychiatry: a narrative review. Psychol Med 53, 7983–7993. doi: 10.1017/S0033291723002817
Bousman, C. A., Stevenson, J. M., Ramsey, L. B., Sangkuhl, K., Hicks, J. K., Strawn, J. R., et al. (2023b). Clinical Pharmacogenetics Implementation Consortium (CPIC) Guideline for CYP2D6, CYP2C19, CYP2B6, SLC6A4, and HTR2A Genotypes and Serotonin Reuptake Inhibitor Antidepressants. Clinical Pharmacology & Therapeutics 114, 51–68. doi: 10.1002/cpt.2903
Brenner, M. H., Curbow, B., and Legro, M. W. (1995). The Proximal-Distal Continuum of Multiple Health Outcome Measures: The Case of Cataract Surgery. Medical Care 33, AS236–AS244.
Champely, S. (2020). pwr: Basic Functions for Power Analysis. Available at: https://github.com/heliosdrm/pwr
Chang, W., Cheng, J., Allaire, J. J., Sievert, C., Schloerke, B., Xie, Y., et al. (2025). shiny: Web Application Framework for R. Available at: https://shiny.posit.co/
Dellen, E. van (2024). Precision psychiatry: predicting predictability. Psychological Medicine 54, 1500–1509. doi: 10.1017/S0033291724000370
Duarte, J. D., Thomas, C. D., Lee, C. R., Huddart, R., Agundez, J. A. G., Baye, J. F., et al. (2024). Clinical Pharmacogenetics Implementation Consortium Guideline (CPIC) for CYP2D6, ADRB1, ADRB2, ADRA2C, GRK4, and GRK5 Genotypes and Beta-Blocker Therapy. Clinical Pharmacology & Therapeutics 116, 939–947. doi: 10.1002/cpt.3351
Eichler, H.-G., Abadie, E., Breckenridge, A., Flamion, B., Gustafsson, L. L., Leufkens, H., et al. (2011). Bridging the efficacy–effectiveness gap: a regulator’s perspective on addressing variability of drug response. Nat Rev Drug Discov 10, 495–506. doi: 10.1038/nrd3501
Gelman, A., and Carlin, J. (2014). Beyond Power Calculations: Assessing Type S (Sign) and Type M (Magnitude) Errors. Perspect Psychol Sci 9, 641–651. doi: 10.1177/1745691614551642
Gottesman, I. I., and Gould, T. D. (2003). The Endophenotype Concept in Psychiatry: Etymology and Strategic Intentions. AJP 160, 636–645. doi: 10.1176/appi.ajp.160.4.636
Groenwold, R. H. H. (2021). “Chapter 2 - The efficacy-effectiveness gap,” in Pragmatic Randomized Clinical Trials, eds. C. J. Girman and M. E. Ritchey (Academic Press), 9–19. doi: 10.1016/B978-0-12-817663-4.00024-6
Guchelaar, H.-J., van der Wouden, C. H., Manson, L. E. N., Abdullah-Koolmees, H., Blagec, K., Blagus, T., et al. (2025). Pharmacogenetic Implementation Studies—Lessons Learned From the PREPARE Study. Clin Pharmacol Ther. n/a. doi: https://doi.org/10.1002/cpt.3749
Howes, O. D., Thase, M. E., and Pillinger, T. (2022). Treatment resistance in psychiatry: state of the art and new directions. Mol Psychiatry 27, 58–72. doi: 10.1038/s41380-021-01200-3
Huang, W., Percie du Sert, N., Vollert, J., and Rice, A. S. C. (2020). “General Principles of Preclinical Study Design,” in Good Research Practice in Non-Clinical Pharmacology and Biomedicine, eds. A. Bespalov, M. C. Michel, and T. Steckler (Cham: Springer International Publishing), 55–69. doi: 10.1007/164_2019_277
Huda, A. S. (2019). The medical model in mental health: an explanation and evaluation. Oxford: Oxford university press.
Hughes, D. A. (2018). Economics of Pharmacogenetic-Guided Treatments: Underwhelming or Overstated? Clinical Pharmacology & Therapeutics 103, 749–751. doi: 10.1002/cpt.1030
Huhn, M., Tardy, M., Spineli, L. M., Kissling, W., Förstl, H., Pitschel-Walz, G., et al. (2014). Efficacy of Pharmacotherapy and Psychotherapy for Adult Psychiatric Disorders: A Systematic Overview of Meta-analyses. JAMA Psychiatry 71, 706–715. doi: 10.1001/jamapsychiatry.2014.112
Ingelman-Sundberg, M., and Molden, E. (2025). Therapeutic drug monitoring, liquid biopsies or pharmacogenomics for prediction of human drug metabolism and response. British Journal of Clinical Pharmacology 91, 1569–1579. doi: 10.1111/bcp.16048
IntHout, J., Ioannidis, J. P. A., Rovers, M. M., and Goeman, J. J. (2016). Plea for routinely presenting prediction intervals in meta-analysis. BMJ Open 6, e010247. doi: 10.1136/bmjopen-2015-010247
Kacser, H., and Burns, J. A. (1981). THE MOLECULAR BASIS OF DOMINANCE. Genetics 97, 639–666. doi: 10.1093/genetics/97.3-4.639
Klein, T. E., and Ritchie, M. D. (2018). PharmCAT: A Pharmacogenomics Clinical Annotation Tool. Clinical Pharmacology & Therapeutics 104, 19–22. doi: 10.1002/cpt.928
Lauschke, V. M., Zhou, Y., and Ingelman-Sundberg, M. (2024). Pharmacogenomics Beyond Single Common Genetic Variants: The Way Forward. Annual Review of Pharmacology and Toxicology 64, 33–51. doi: 10.1146/annurev-pharmtox-051921-091209
Leucht, S., Hierl, S., Kissling, W., Dold, M., and Davis, J. M. (2012). Putting the efficacy of psychiatric and general medicine medication into perspective: review of meta-analyses. The British Journal of Psychiatry 200, 97–106. doi: 10.1192/bjp.bp.111.096594
Lüdecke, D. (2018). esc: Effect Size Computation for Meta Analysis. doi: 10.5281/zenodo.1249218
Masimirembwa, C., Dandara, C., and Hasler, J. (2014). “Chapter 43 - Population Diversity and Pharmacogenomics in Africa,” in Handbook of Pharmacogenomics and Stratified Medicine, ed. S. Padmanabhan (San Diego: Academic Press), 971–998. doi: 10.1016/B978-0-12-386882-4.00043-8
Moher, D., Liberati, A., Tetzlaff, J., and Altman, D. G. (2010). Preferred reporting items for systematic reviews and meta-analyses: The PRISMA statement. International Journal of Surgery 8, 336–341. doi: 10.1016/j.ijsu.2010.02.007
Nakagawa, S., Lagisz, M., O’Dea, R. E., Rutkowska, J., Yang, Y., Noble, D. W. A., et al. (2021). The orchard plot: Cultivating a forest plot for use in ecology, evolution, and beyond. Research Synthesis Methods 12, 4–12. doi: 10.1002/jrsm.1424
Nutt, D. J. (2025). Drug development in psychiatry: 50 years of failure and how to resuscitate it. The Lancet Psychiatry 12, 228–238. doi: 10.1016/S2215-0366(24)00370-5
Pardiñas, A. F., Owen, M. J., and Walters, J. T. R. (2021). Pharmacogenomics: A road ahead for precision medicine in psychiatry. Neuron 109, 3914–3929. doi: 10.1016/j.neuron.2021.09.011
Pirmohamed, M., and Park, B. K. (2001). Genetic susceptibility to adverse drug reactions. Trends in Pharmacological Sciences 22, 298–305. doi: 10.1016/S0165-6147(00)01717-X
PlotDigitizer: Version 3.1.6 (2025). Available at: https://plotdigitizer.com
Popejoy, A. B. (2019). <p>Diversity In Precision Medicine And Pharmacogenetics: Methodological And Conceptual Considerations For Broadening Participation</p>. PGPM 12, 257–271. doi: 10.2147/PGPM.S179742
Pustejovsky, J. (2024). clubSandwich: Cluster-Robust (Sandwich) Variance Estimators with Small-Sample Corrections. Available at: http://jepusto.github.io/clubSandwich/
R Core Team (2021). R: A Language and Environment for Statistical Computing. Available at: https://www.R-project.org/
Roden, D. M., Altman, R. B., Benowitz, N. L., Flockhart, D. A., Giacomini, K. M., Johnson, J. A., et al. (2006). Pharmacogenomics: Challenges and Opportunities. Ann Intern Med 145, 749–757. doi: 10.7326/0003-4819-145-10-200611210-00007
Roden, D. M., McLeod, H. L., Relling, M. V., Williams, M. S., Mensah, G. A., Peterson, J. F., et al. (2019). Pharmacogenomics. The Lancet 394, 521–532. doi: 10.1016/S0140-6736(19)31276-0
Rodgers, M. A., and Pustejovsky, J. E. (2021). Evaluating meta-analytic methods to detect selective reporting in the presence of dependent effect sizes. Psychological Methods 26, 141–160. doi: 10.1037/met0000300
Simon, N., and von Fabeck, K. (2025). Are plasma drug concentrations still necessary? Rethinking the pharmacokinetic link in dose–response relationships. Front. Pharmacol. 16. doi: 10.3389/fphar.2025.1660323
Sluis, S. van der, Verhage, M., Posthuma, D., and Dolan, C. V. (2010). Phenotypic Complexity, Measurement Bias, and Poor Phenotypic Resolution Contribute to the Missing Heritability Problem in Genetic Association Studies. PLOS ONE 5, e13929. doi: 10.1371/journal.pone.0013929
Spina, E., and de Leon, J. (2015). Clinical applications of CYP genotyping in psychiatry. J Neural Transm 122, 5–28. doi: 10.1007/s00702-014-1300-5
Stern, S., Linker, S., Vadodaria, K. C., Marchetto, M. C., and Gage, F. H. (2018). Prediction of response to drug therapy in psychiatric disorders. Open Biology 8, 180031. doi: 10.1098/rsob.180031
van Zwet, E., and Gelman, A. (2022). A Proposal for Informative Default Priors Scaled by the Standard Error of Estimates. The American Statistician 76, 1–9. doi: 10.1080/00031305.2021.1938225
Viechtbauer, W. (2010). Conducting Meta-Analyses in R with the metafor Package. Journal of Statistical Software 36, 1–48. doi: 10.18637/jss.v036.i03
Wan, X., Wang, W., Liu, J., and Tong, T. (2014). Estimating the sample mean and standard deviation from the sample size, median, range and/or interquartile range. BMC Medical Research Methodology 14, 135. doi: 10.1186/1471-2288-14-135
Whirl-Carrillo, M., Huddart, R., Gong, L., Sangkuhl, K., Thorn, C. F., Whaley, R., et al. (2021). An Evidence-Based Framework for Evaluating Pharmacogenomics Knowledge for Personalized Medicine. Clinical Pharmacology & Therapeutics 110, 563–572. doi: 10.1002/cpt.2350
Wu, A. H. B. (2015). Pharmacogenomic testing and response to warfarin. The Lancet 385, 2231–2232. doi: 10.1016/S0140-6736(14)62219-4
Zhao, M., Ma, J., Li, M., Zhang, Y., Jiang, B., Zhao, X., et al. (2021). Cytochrome P450 Enzymes and Drug Metabolism in Humans. International Journal of Molecular Sciences 22, 12808. doi: 10.3390/ijms222312808
Zöllner, S., and Pritchard, J. K. (2007). Overcoming the Winner’s Curse: Estimating Penetrance Parameters from Case-Control Data. The American Journal of Human Genetics 80, 605–615. doi: 10.1086/512821
Zwetsloot, P.-P., Van Der Naald, M., Sena, E. S., Howells, D. W., IntHout, J., De Groot, J. A., et al. (2017). Standardized mean differences cause funnel plot distortion in publication bias assessments. eLife 6, e24260. doi: 10.7554/eLife.24260

<br>
<br>
<br>
<br>

## <strong> Supplementary Methods </strong> {.tabset}
### Literature Search Terms
#### Literature Search Terms

Literature searches were conducted across PUBMED, Cochrane, and SCOPUS on November 5th, 2024. Exact search varied by database; however, the following terms and Boolean operators were used to search across titles: <p>

Pharmacogenomics keyword AND <p>

> ("pharmacogen\*" OR "CYP" OR "CYP2C19" OR "CYP2D6" OR "CYP1A2" OR "CYP3A4" OR "CYP3A5" OR "CYP2C9" OR "cytochrome P450" OR "genotype" OR "allele" OR "star allele" OR "metabol\*" OR "metabol\* status" OR "metabol* phenotype" OR "poor metabol\*" OR "intermediate metabol\*" OR "extensive metabol\*" OR "normal metabol\*" OR "rapid metabol\*" OR "ultrarapid metabol\*" OR "ultra-rapid metabol\*" OR "activity score" OR "activity" OR "increased function" OR "decreased function")

Medication keyword AND <p>

>("psychiatric" OR "drugs" OR "medication" OR "clozapine" OR "risperidone" OR "quetiapine" OR "olanzapine" OR "aripiprazole" OR "haloperidol" OR "antipsychotic" OR "atypical antipsychotic" OR "typical antipsychotic" OR "neuroleptic" OR "sertraline" OR "escitalopram" OR "amitriptyline" OR "nortriptyline" OR "paroxetine" OR "venlafaxine" OR "fluvoxamine" OR "fluoxetine" OR "antidepressants" OR "SSRIs")

Outcome keyword AND <p>

>("metabolic ratio" OR "concentration" OR "levels" OR "serum" OR "plasma" OR "moiety" OR "metabolite" OR "clearance" OR "AUC" OR "half life" OR "C/D" OR "dose" OR "dose adjustment" OR "sympt\*" OR "improve\*" OR "increas\*" OR "decreas\*" OR "reduc\*" OR "sever\*" OR "tolerability" OR "response" OR "remission" OR "discontinuation" OR "therapeutic outcome" OR "treatment outcome" OR "therapeutic response" OR "failure" OR "symptom" OR "efficacy" OR "compliance" OR "adherence" OR "extra-pyramidal" OR "extra pyramidal" OR "side effects" OR "adverse effects" OR "adverse drug reaction" OR "ADR" OR "adverse event" OR "QTc" OR "prolactin" OR "side effect" OR "tardive" OR "weight gain" OR "switch" OR "sedation" OR "drop out" OR "score" OR "suicid\*" OR "resistance" OR "refractory" OR "responsive" OR "hospital\*")

AND NOT Entry type keyword <p>

>("Guidelines" OR "Guideline" OR "Review" OR "guidelines" OR "guideline" OR "review" OR "case study" OR "case series" OR "case report")

<br>

In the PUBMED search only, we filtered to studies conducted on humans. Any studies conducted in vitro or on non-human animals that were identified from other databases were excluded during the later screening stages.


<br>
<br>

### Effect Size Conversions
#### Effect Size Conversions

Across the included studies, results were reported using a range of statistics such as measures of central tendency, observations, and those from inferential tests. These were used to calculate the standardised mean difference of the pharmacogenomic effect as outlined in Supplementary Table 1.  When SMD was calculated based on descriptive statistics or observations, we used a minimum per-group sample size of N = 5 (Curtis et al. 2015), and per-analysis sample size of N = 25 for regression models (Jenkins and Quintana-Ascencio 2020). 

| Reported Effect Size | Reported Variance             | Conversions                                                                     | Required Effect Size (etc)  | package::function() |
| -------------------- | ----------------------------- | ------------------------------------------------------------------------------- | --------------------------- | ------------------- |
| Mean                 | Standard deviation            | NA                                                                              | Mean and Standard deviation | esc::esc_mean_sd()  |
| Mean                 | Confidence intervals          | Confidence Intervals to Standard Error to Standard Deviation.<sup>1</sup>       | Mean and Standard deviation | esc::esc_mean_sd()  |
| Mean                 | Standard Errors               | Confidence Intervals to Standard Error.<sup>2</sup>                             | Mean and Standard deviation | esc::esc_mean_sd()  |
| Median               | Interquartile range, Min, Max | Median and IQR and Range to Mean<sup>3</sup> and Standard Deviation<sup>4</sup> | Mean and Standard deviation | esc::esc_mean_sd()  |
| Median               | Range                         | Median and Range to Mean<sup>5</sup> and Standard Deviation<sup>6</sup>         | Mean and Standard deviation | esc::esc_mean_sd()  |
| Median               | Interquartile range           | Median and IQR to Mean<sup>7</sup> and Standard Deviation<sup>8</sup>           | Mean and Standard deviation | esc::esc_mean_sd()  |
| χ<sup>2</sup>        | NA                            | NA                                                                              | χ<sup>2</sup>/p N           | esc::esc_2x2()      |
| OR                   | Confidence intervals          | Confidence Intervals to Standard Error<sup>9</sup>                              | OR and Standard error       | esc::convert_or2d() |
| β                    | SE                            | Beta and SE to t<sup>10</sup>                                                   | t, p, total N               | esc::esc_t()        |
| t                    | NA                            | NA                                                                              | t, p, total N               | esc::esc_t()        |


Supplementary Table 1. Overview of equations used to calculate effect sizes from reported data in the present study. 

<br>
<br>

#### Measures of Central Tendency
Means were reported alongside standard deviations (SD), standard errors (SE), and confidence intervals (CIs). They can be converted to standardised mean difference with the `esc::esc_mean_sd()` function. Mean and standard deviation do not require further conversion. Standard errors and confidence interval need to be changed to standard deviation prior to running the function. 
95% confidence intervals for a mean can be converted to standard errors as shown below. The denominator is taken from the normal distribution, and different denominators are used for different confidence intervals; 3.92 is used for 95% confidence intervals. 

$$\begin{aligned}
1) SE = \frac{CI(Upper)-CI(Lower)}{3.92}
\end{aligned}$$

Where groups have small sample sizes (N), the confidence intervals should have been sampled from the t distribution, and not the normal distribution. At low samples (< 30), the t distribution and the normal distribution differ, and so when the group N is lower than 30 the denominator is instead replaced with the inverse of the t distribution for the given sample size (Higgins et al. 2024). This function is defined as `tinv()` in this markdown. 

Standard error is converted to standard deviation as follows.

$$\begin{aligned}
2) SD = SE \times \sqrt{N}
\end{aligned}$$

Medians were also reported in papers alongside interquartile ranges and/or ranges. We estimated means and standard deviations using the following equations (Wan et al. 2014), as these allow for better estimates at low sample sizes than previous methods (Hozo et al. 2005; Bland 2014).
Median, IQR, Min, Max are available, mean and standard deviation are calculated as so, and have been defined in this markdown as `c1_meansd`:

$$\begin{aligned}
3)Mean = \frac{Min+(2 \times Q1)+(2 \times Median)+(2 \times Q3)+Max}{8} \\ \\
4)SD = \frac{Max - Min}{4 \times qnorm((\frac{N-0.375}{N+0.25}),0,1)} + \frac{Q3-Q1}{4 \times qnorm((\frac{0.75 \times N-0.125}{N+0.25}),0,1)}
\end{aligned}$$

When only the median and range are available, the formulae become, and have been defined in this markdown as `c2_meansd`:

$$\begin{aligned}
5)Mean = \frac{Min+(2 \times Median)+Max}{4} \\ \\
6)SD=\frac{Max-Min}{2 \times qnorm((\frac{N-0.375}{N+0.25}),0,1)}
\end{aligned}$$

When only the median and IQR are available, the formulae become, and have been defined in this markdown as `c3_meansd`:

$$\begin{aligned}
7)Mean = \frac{Q1+Median+Q3}{3} \\ \\
8)SD=\frac{Q3-Q1}{2 \times qnorm((\frac{0.75 \times N-0.125}{N+0.25}),0,1)}
\end{aligned}$$

Where intervention studies report statistics as a change between baseline and a given time point, we calculate the SMD at each time point separately. We did not combine SMDs calculated at a single time point with those representing a change over time as recommended in the Cochrane handbook, given that this can be problematic when using the standardised mean difference (Higgins et al. 2024); thus, if single time point measures were not available, these were excluded from the analysis.

<br>
<br>

#### Observations
Where observational data were reported, the SMD was calculated using `esc::2x2()`. In instances where a cell count in the 2x2 table was 0, we performed a Haldane-Anscome correction by adding 0.5 to all counts in that table to allow the SMD to be calculated (Weber et al. 2020).

<br>
<br>

#### Measures of Effect (Ratio Measures)
Odds ratios (OR) are reported with confidence intervals. These must be converted into standard errors prior to estimating the SMD (`esc::convert_or2d()`). The equation is the same as above, however the natural log of the upper and lower confidence intervals must be used instead. There is no need to sample from the t-distribution at low sample sizes. Where variables log-transformed prior to use in the model, the OR was back-transformed.

$$\begin{aligned}
9) SE = \frac{log(CI(Upper))-log(CI(Lower))}{3.92}
\end{aligned}$$

<br>
<br>

#### Measures of Effect (Absolute Measures)
Many regression analyses report beta coefficients, often alongside standard errors. These cannot be directly converted to SMD. However, they can be converted to a t statistic which can then be converted to SMD. Where variables log-transformed prior to use in the model, the β was back-transformed.

$$\begin{aligned}
10) t = \beta \times SE
\end{aligned}$$

The *t* statistics can be directly converted to an SMD estimate by using the t statistic, its p value and the total number of participants analysed using `esc::esc_t()`.

<br>
<br>

#### Metabolic Ratios
Metabolic ratios have been reported in one of two ways:

i)	Metabolic Ratio = drug / metabolite
ii)	Metabolic Ratio = metabolite / drug

The interpretation of these is different, with higher values reflecting slower metabolism in the first case, and faster metabolism in the second case. Although the interpretation is slightly less intuitive, most metabolic ratios have been reported with the parent drug divided by the metabolite. Therefore, all other metabolic ratios have been converted so that they are equivalent to this standard. This method varies slightly dependent on whether results are given as mean, β, or ORs (see equations 11 – 13). The same method was applied to their standard deviations, standard errors, and confidence intervals, respectively. 

$$\begin{aligned}
11) Mean\frac{D}{M} = exp(log(Mean\frac{M}{D})\times-1) \\ \\
12)\beta\frac{D}{M} = exp(log(\beta\frac{M}{D})\times-1) \\ \\
13)OR\frac{D}{M} = exp(log(OR\frac{M}{D})\times-1)
\end{aligned}$$

<br>
<br>

#### Joining Groups
There are also instances where we want to calculate metabolism phenotypes based on per genotype means/SDs or combine metabolism phenotypes if they have been inappropriately assigned. To do this we have followed Cochrane guidance (Higgins et al. 2024) using the equations below, defined as `join_means()` in this markdown:

$$\begin{aligned}
14) Mean = \frac{N{1}M{1}+N{2}M{2}}{N{1}+N{2}} \\ \\
15) SD = \sqrt \frac{(N{1}-1)SD{1}^2+(N{2}-1)SD{2}^2+\frac{N{1}N{2}}{N{1}+N{2}}(M{1}^2+M{2}^2 - 2M{1}M{2})}{N{1}+N{2}-1}
\end{aligned}$$

<br>
<br>
<br>
<br>

### Pharmacogenomic Alleles and Metabolism Phenotypes
#### Pharmacogenomic Alleles and Metabolism Phenotypes

We used information from PharmGKB Gene-Specific Information tables to define allele functions and metabolism phenotypes. Where genetic information was reported as SNPs, we used information from PyPGx to identify the genetic variants that characterise PharmGKB alleles. Analyses were excluded where CYP metabolism phenotypes were inferred using non-genetic approaches, or where SNPs were not aligned with pharmacogenomic star allele definitions. We were unable to resolve metabolism phenotypes for 420 analyses.

When reviewing the SNP-to-allele table for CYP2D6, we noted many studies in our meta-analysis called CYP2D6\*10 based on a single SNP (rs1065852), despite that SNP being found in multiple CYP2D6 star alleles. This definition is a simplification of the allelic landscape of CYP2D6 but has been noted before as common throughout the pharmacogenomics literature (Nofziger et al. 2020). In an effort to best standardise pharmacogenomic allele calling across our meta-analysis, we have chosen to assign CYP2D6*10 alleles, and where possible CYP2D6 metabolism phenotypes, using solely rs1065852. We acknowledge this is a potential limitation of our study, caused by a common practice that should be addressed by future studies. The retrieval date of the PharmGKB/PyPGx tables was 17/07/2025. 


<br>
<br>

##### CYP1A2

Gene-specific information tables are not available for this gene; therefore, allele definitions and functions were taken from the PyPGx information tables. There is no current consensus regarding the mapping of star alleles to metabolism phenotypes for CYP1A2 (Fekete et al. 2022; Kuhn et al. 2025), therefore pharmacogenomic information has been in the format of star allele diplotypes.

| **SNP**                        | **Allele** | **Function**       | **Source** |
| ------------------------------ | ---------- | ------------------ | ---------- |
| \-                             | \*1A       | Normal Function    | PyPGx      |
| rs2069514 (-2964G>A; -3860G>A) | \*1C       | Decreased Function | PyPGx      |
| rs762551 (-173C>A; 163C>A)     | \*1F       | Increased function | PyPGx      |

Supplementary Table 2. Functions of CYP1A2 SNPs and pharmacogenomic alleles referenced in the studies curated for this meta-analysis.

<br>
<br>

##### CYP2B6
PharmGKB gene-specific information tables are available and have been used in the present study. Metabolism phenotypes were determined based on the functionality of alleles in the diplotype.  

| **SNPs**             | **Allele** | **Function**       | **Source**      |
| -------------------- | ---------- | ------------------ | --------------- |
| \-                   | \*1        | Normal function    | PyPGx, PharmGKB |
| rs3745274, rs2279343 | \*6        | Decreased function | PyPGx, PharmGKB |
| rs3745274            | \*9        | Decreased function | PyPGx, PharmGKB |

Supplementary Table 3. Functions of CYP2B6 SNPs and pharmacogenomic alleles referenced in the studies curated for this meta-analysis.

<br>
<br>

| **Diplotype** | **Metabolism Phenotype** | **Source**      |
| ------------- | ------------------------ | --------------- |
| \*1/\*1       | Normal Metabolizer       | PyPGx, PharmGKB |
| \*1/\*6       | Intermediate Metabolizer | PyPGx, PharmGKB |
| \*6/\*6       | Poor Metabolizer         | PyPGx, PharmGKB |
| \*6/\*9       | Poor Metabolizer         | PyPGx, PharmGKB |

Supplementary Table 4. Metabolism phenotypes for CYP2B6 diplotypes referenced in the studies curated for this meta-analysis. 

<br>
<br>

##### CYP2C9
PharmGKB gene-specific information tables were available and have been used in the present study. Metabolism phenotypes were determined based on the functionality of alleles in the diplotype, and by extension the total activity score.  

*	Poor Metaboliser is assigned to those with activity scores 0 <= score < 1.
*	Intermediate Metaboliser is assigned to those with activity scores 1 <= score < 2.
*	Normal Metaboliser is assigned to those with activity scores 2 == score.

| **Allele** | **Function**       | **Activity Score** | **Source**      |
| ---------- | ------------------ | ------------------ | --------------- |
| \*1        | Normal function    | 1                  | PyPGx, PharmGKB |
| \*2        | Decreased function | 0.5                | PyPGx, PharmGKB |
| \*3        | Null function      | 0                  | PyPGx, PharmGKB |

Supplementary Table 5. Functions of CYP2C9 pharmacogenomic alleles referenced in the studies curated for this meta-analysis.

<br>
<br>

| **Diplotype** | **Metabolism Phenotype** | **Total Activity Score** | **Source**      |
| ------------- | ------------------------ | ------------------------ | --------------- |
| \*1/\*1       | Normal metaboliser       | 2                        | PyPGx, PharmGKB |
| \*1/\*2       | Intermediate metaboliser | 1.5                      | PyPGx, PharmGKB |
| \*1/\*3       | Intermediate metaboliser | 1                        | PyPGx, PharmGKB |
| \*2/\*2       | Intermediate metaboliser | 1                        | PyPGx, PharmGKB |
| \*2/\*3       | Poor metaboliser         | 0.5                      | PyPGx, PharmGKB |
| \*3/\*3       | Poor metaboliser         | 0                        | PyPGx, PharmGKB |

Supplementary Table 6. Metabolism phenotypes for CYP2C9 diplotypes referenced in the studies curated for this meta-analysis. 

<br>
<br>

##### CYP2C19
PharmGKB gene-specific information tables were available and have been used in the present study. Metabolism phenotypes were determined based on the functionality of alleles in the diplotype. 

| **SNPs**              | **Allele** | **Function**       | **Source**      |
| --------------------- | ---------- | ------------------ | --------------- |
| **\-**                | \*1        | Normal function    | PyPGx, PharmGKB |
| rs4244285, rs12769205 | \*2        | Null function      | PyPGx, PharmGKB |
| rs4986893             | \*3        | Null function      | PyPGx, PharmGKB |
|                       | \*4        | Null function      | PyPGx, PharmGKB |
|                       | \*5        | Null function      | PyPGx, PharmGKB |
|                       | \*6        | Null function      | PyPGx, PharmGKB |
| rs12248560            | \*17       | Increased function | PyPGx, PharmGKB |

Supplementary Table 7. Functions of CYP2C19 SNPs and pharmacogenomic alleles referenced in the studies curated for this meta-analysis.

<br>
<br>

| **Diplotype** | **Metabolism Phenotype** | **Source**      |
| ------------- | ------------------------ | --------------- |
| \*1/\*1       | Normal Metabolizer       | PyPGx, PharmGKB |
| \*1/\*2       | Intermediate Metabolizer | PyPGx, PharmGKB |
| \*1/\*3       | Intermediate Metabolizer | PyPGx, PharmGKB |
| \*1/\*4       | Intermediate Metabolizer | PyPGx, PharmGKB |
| \*1/\*5       | Intermediate Metabolizer | PyPGx, PharmGKB |
| \*1/\*6       | Intermediate Metabolizer | PyPGx, PharmGKB |
| \*1/\*17      | Rapid Metaboliser        | PyPGx, PharmGKB |
| \*2/\*2       | Poor Metabolizer         | PyPGx, PharmGKB |
| \*2/\*3       | Poor Metabolizer         | PyPGx, PharmGKB |
| \*2/\*4       | Poor Metabolizer         | PyPGx, PharmGKB |
| \*2/\*17      | Intermediate Metabolizer | PyPGx, PharmGKB |
| \*3/\*3       | Poor Metabolizer         | PyPGx, PharmGKB |
| \*17/\*17     | Ultrarapid Metaboliser   | PyPGx, PharmGKB |

Supplementary Table 8. Metabolism phenotypes for CYP2C19 diplotypes referenced in the studies curated for this meta-analysis. 

<br>
<br>

##### CYP2D6
PharmGKB gene-specific information tables were available and have been used in the present study Metabolism phenotypes are determined based on the functionality of alleles, via their activity scores, in the diplotype as follows: 

*	Poor Metaboliser is assigned to those with activity scores 0 <= score < 0.25.
*	Intermediate Metaboliser is assigned to those with activity scores 0.25 <= score < 1.25.
*	Normal Metaboliser is assigned to those with activity scores 1.25 <= score < 2.5.
*	Ultrarapid Metaboliser is assigned to those with activity scores 2.5 <= score.

| **SNP**               | **Allele** | **Activity Score** | **Function**       | **Source**      |
| --------------------- | ---------- | ------------------ | ------------------ | --------------- |
| \-                    | \*1        | 1                  | Normal Function    | PyPGx, PharmGKB |
| \-                    | \*1x2      | 2.0                | Increased function | PharmGKB        |
|                       | \*2        | 1.0                | Normal function    | PyPGx, PharmGKB |
| rs35742686            | \*3        | 0                  | Null Function      | PyPGx, PharmGKB |
| rs3892097 (1846G>A)   | \*4        | 0                  | Null Function      | PyPGx, PharmGKB |
|                       | \*5        | 0                  | Null Function      | PyPGx, PharmGKB |
|                       | \*6        | 0                  | Null Function      | PyPGx, PharmGKB |
|                       | \*7        | 0                  | Null Function      | PyPGx, PharmGKB |
|                       | \*8        | 0                  | Null Function      | PyPGx, PharmGKB |
| rs1065852             | \*10       | 0.25               | Decreased          | PyPGx, PharmGKB |
| rs5030865<sup>†</sup> | \*14       | 0.5                | Decreased          | PyPGx, PharmGKB |
| <sup>††</sup>         | \*41       | 0.25               | Decreased          | PharmGKB        |

Supplementary Table 9. Functions of CYP2D6 SNPs and pharmacogenomic alleles referenced in the studies curated for this meta-analysis. †T allele reflects CYP2D6\*14, whereas A allele at this location reflects CYP2D6\*8. ††Activity scores for \*41 conflict between PyPGx (0.5) and PharmGKB (0.25). PharmGKB is the newest so was used for the present study. 

<br>
<br>


| **Diplotype** | **Total Activity Score** | **Metabolism Phenotype** | **Source** |
| ------------- | ------------------------ | ------------------------ | ---------- |
| \*1/\*1       | 2                        | Normal Metaboliser       | PharmGKB   |
| \*1/\*2       | 2                        | Normal Metaboliser       | PharmGKB   |
| \*1/\*3       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*1/\*4       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*1/\*5       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*1/\*6       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*1/\*7       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*1/\*8       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*1/\*10      | 1.25                     | Normal Metaboliser       | PharmGKB   |
| \*1/\*41      | 1.25                     | Normal Metaboliser       | PharmGKB   |
| \*1/(\*1x2)   | 3                        | Ultrarapid metaboliser   | PharmGKB   |
| \*1/(\*1xN)   | \> 2                     | Ultrarapid metaboliser   | PharmGKB   |
| \*1/(\*2xN)   | \> 2                     | Ultrarapid metaboliser   | PharmGKB   |
| \*2/\*2       | 2                        | Normal Metaboliser       | PharmGKB   |
| \*2/\*3       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*2/\*5       | 1                        | Intermediate Metaboliser | PharmGKB   |
| \*2/\*10      | 1.25                     | Normal Metaboliser       | PharmGKB   |
| \*2/\*41      | 1.25                     | Normal Metaboliser       | PharmGKB   |
| \*3/\*4       | 0                        | Poor Metaboliser         | PharmGKB   |
| \*3/\*5       | 0                        | Poor Metaboliser         | PharmGKB   |
| \*4/\*4       | 0                        | Poor Metaboliser         | PharmGKB   |
| \*4/\*5       | 0                        | Poor Metaboliser         | PharmGKB   |
| \*4/\*6       | 0                        | Poor Metaboliser         | PharmGKB   |
| \*4/\*10      | 0.25                     | Intermediate Metaboliser | PharmGKB   |
| \*4/\*14      | 0.5                      | Intermediate Metaboliser | PharmGKB   |
| (2x\*1)/\*4   | 2                        | Normal Metaboliser       | PharmGKB   |
| \*5/\*6       | 0                        | Poor Metaboliser         | PharmGKB   |
| \*5/\*10      | 0.25                     | Intermediate Metaboliser | PharmGKB   |
| \*6/\*6       | 0                        | Poor Metaboliser         | PharmGKB   |
| \*10/\*10     | 0.5                      | Intermediate Metaboliser | PharmGKB   |
| \*10/\*41     | 0.5                      | Intermediate Metaboliser | PharmGKB   |

Supplementary Table 10. Metabolism phenotypes for CYP2D6 diplotypes referenced in the studies curated for this meta-analysis.
 
<br>
<br>

##### CYP3A4
PharmGKB gene-specific information tables were available and have been used in the present study. There is no information regarding genotype to metabolism phenotype conversion and so genetic information was retained in its original format. are determined based on the functionality of alleles in the diplotype.

|           | **Allele** | **Function**     | **Source** |
| --------- | ---------- | ---------------- | ---------- |
|           | \*1        | Normal Function  | PyPGx      |
| rs2740574 | \*1B       | Unknown Function | PharmGKB   |
|           | \*22       | Unknown Function | PyPGx      |

Supplementary Table 11. Functions of CYP3A4 SNPs and pharmacogenomic alleles referenced in the studies curated for this meta-analysis.

<br>
<br>

##### CYP3A5
PharmGKB gene-specific information tables were available and have been used in the present study. Metabolism phenotypes are determined based on the functionality of alleles in the diplotype.

| **Allele** | **Function**    | **Source** |
| ---------- | --------------- | ---------- |
| \*1        | Normal function | PyPGx      |
| \*3        | Null function   | PyPGx      |
| \*6        | Null function   | PyPGx      |

Supplementary Table 12. Functions of CYP3A5 pharmacogenomic alleles referenced in the studies curated for this meta-analysis.

<br>
<br>

| **Diplotype** | **Metabolism Phenotype** | **Source** |
| ------------- | ------------------------ | ---------- |
| \*1/\*1       | Normal Metaboliser       | PyPGx      |
| \*1/\*3       | Intermediate Metaboliser | PyPGx      |
| \*1/\*6       | Intermediate Metaboliser | PyPGx      |
| \*3/\*3       | Poor Metaboliser         | PyPGx      |
| \*3/\*6       | Poor Metaboliser         | PyPGx      |
| \*6/\*6       | Poor Metaboliser         | PyPGx      |

Supplementary Table 13. Metabolism phenotypes for CYP3A5 diplotypes referenced in the studies curated for this meta-analysis. 

<br>
<br>
<br>
<br>

## <strong> Supplementary Results </strong> {.tabset}
### Bayesian Re-Analysis 
#### Addressing “winner’s curse” in psychiatric pharmacogenomic studies.
```{r bayseian set up, warning=FALSE}
#### Load and process z-scores ####
proximal <- all_smd %>% filter(rating=="Proximal") %>% select(Study,z,SMD,SE)
distal <- all_smd %>% filter(rating=="Distal") %>% select(Study,z,SMD,SE)
                   
#### Fit a mixture of normal distributions to the data (i.e. modelling the centre and the tails separately) ####
# Code adapted from https://doi.org/10.1080/00031305.2021.1938225

# Proximal effects
proximal.fit=flexmix(z ~ 0|Study, data=proximal, k = 2)
for (i in 1:10){ # try few restarts
  tmp.fit=flexmix(z ~ 0|Study, data=proximal, k = 2)
  if (tmp.fit@logLik > proximal.fit@logLik) proximal.fit = tmp.fit
}
proximal.p=summary(proximal.fit)@comptab$prior
proximal.ind=order(parameters(proximal.fit))
proximal.sd1=parameters(proximal.fit)[proximal.ind[1]]
proximal.sd2=parameters(proximal.fit)[proximal.ind[2]]
proximal.p=proximal.p[proximal.ind[1]]
#cat("distr of z: p=",proximal.p,"\t sd1=",proximal.sd1,"\t sd2=",proximal.sd2,"\n")
proximal.tau1=sqrt(proximal.sd1^2 - 1)
proximal.tau2=sqrt(proximal.sd2^2 - 1)
#cat("distr of snr: p=",proximal.p,"\t tau1=",proximal.tau1,"\t tau2=",proximal.tau2,"\n")

# Distal effects
distal.fit=flexmix(z ~ 0|Study, data=distal, k = 2)
for (i in 1:10){ # try few restarts
  tmp.fit=flexmix(z ~ 0|Study, data=distal, k = 2)
  if (tmp.fit@logLik > distal.fit@logLik) distal.fit = tmp.fit
}
distal.p=summary(distal.fit)@comptab$prior
distal.ind=order(parameters(distal.fit))
distal.sd1=parameters(distal.fit)[distal.ind[1]]
distal.sd2=parameters(distal.fit)[distal.ind[2]]
distal.p=distal.p[distal.ind[1]]
#cat("distr of z: p=",distal.p,"\t sd1=",distal.sd1,"\t sd2=",distal.sd2,"\n")
distal.tau1=sqrt(distal.sd1^2 - 1)
distal.tau2=sqrt(distal.sd2^2 - 1)
#cat("distr of snr: p=",distal.p,"\t tau1=",distal.tau1,"\t tau2=",distal.tau2,"\n")

```

The dataset compiled for this work can also be used to evaluate the results of psychiatric pharmacogenomic studies through a Bayesian perspective. Following a general procedure described by van Zwet and Gelman (2022), information from a corpus of existing studies can be used to estimate the degree of potential inflation in a novel result, a phenomenon that often leads to poor replicability known as “winner’s curse” (Zöllner and Pritchard 2007; Ioannidis 2008; van Zwet and Cator 2021). Briefly, this requires modelling a prior distribution of signal-to-noise ratios using reported z-scores. Then, for any new result in the form of regression coefficients and variances, this prior can be used to derive a posterior expectation of unbiased effects (van Zwet and Gelman 2022), assuming the new study is exchangeable with other studies in the corpus (i.e. fits a set of inclusion criteria, in our case focusing on psychiatric medications, CYP metaboliser phenotypes, and an outcome that can be categorised as either “proximal” or “distal”). Such a Bayesian reanalysis of frequentist test results has similarities with regression regularisation procedures (Bickel et al. 2006), but without the need for raw data, making it particularly useful to critically assess published evidence when undertaking translational research (Kraft 2008; van Zwet et al. 2021).

```{r generate plots, warning=FALSE}
#### PROX-DIST DISTR Comparison plot ####
x=seq(-10,10,0.01)
breaks=seq(-10,10,length=31)

proximal.f=proximal.p*dnorm(x,0,proximal.sd1) + (1-proximal.p)*dnorm(x,0,proximal.sd2)
proximal.df1=data.frame(z=proximal$z)
proximal.df2=data.frame(z=x,f=proximal.f)

combined.p1=ggplot(proximal.df1,aes(x=z)) +
   geom_histogram(aes(y=..density..),breaks=breaks, colour="#c8656c", fill="#e4959a") +
   geom_line(data=proximal.df2,aes(x=z,y=f), linewidth = 1.5, linetype = "dotdash", colour = "#975b60")+
   labs(x='',y='') +
   coord_cartesian(xlim=c(-10,10))+ ylim(0,0.325)+ theme_minimal()+
   ggtitle(paste0("Proximal z-scores (n=", nrow(proximal),")")) + 
   xlab("Standardised Mean Difference") +
   ylab("Density") +
    theme(plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))

distal.f=distal.p*dnorm(x,0,distal.sd1) + (1-distal.p)*dnorm(x,0,distal.sd2)
distal.df1=data.frame(z=distal$z)
distal.df2=data.frame(z=x,f=distal.f)

combined.p2=ggplot(distal.df1,aes(x=z)) +
  geom_histogram(aes(y=..density..),breaks=breaks, colour="#3c5256", fill="#43919c") +
  geom_line(data=distal.df2,aes(x=z,y=f), linewidth = 1.5, linetype = "dotdash", colour = "#3c5256")+
  labs(x='',y='') +
  coord_cartesian(xlim=c(-10,10))+ ylim(0,0.325)+ theme_minimal()+
   ggtitle(paste0("Distal z-scores (n=", nrow(distal),")")) + 
  xlab("Standardised Mean Difference") +
  ylab("Density") +
    theme(plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))
#### SNR and shrinkage ####

# Custom functions
posterior = function(b,s,p,tau){
  z=b/s
  tau2=tau^2
  q=p*dnorm(z,0,sqrt(tau2+1))
  q=q/sum(q) # conditional mixing probs
  pm=b*tau2/(tau2+1) # conditional means
  pv=s^2*tau2/(tau2+1) # conditional variances
  ps=sqrt(pv) # conditional std devs
  data.frame(q,pm,pv,ps)
}
shrink = function(b,s,p,tau){
  post=posterior(b,s,p,tau)
  b/sum(post$q * post$pm)
}

# Distribution of the SNR
x=seq(-10,10,0.01)
n=length(x)

pal <- c("#43919c", "#e4959a")


proximal.f2=proximal.p*dnorm(x,0,proximal.tau1) + (1-proximal.p)*dnorm(x,0,proximal.tau2)
distal.f2=distal.p*dnorm(x,0,distal.tau1) + (1-distal.p)*dnorm(x,0,distal.tau2)
combined.df=data.frame(x=rep(x,2),f=c(proximal.f2,distal.f2),corpus=c(rep("Proximal",n),rep("Distal",n)))

combined.p3=ggplot(combined.df,aes(x=x,y=f,color=corpus)) + geom_line(show=FALSE, linewidth = 1.5) +
           # scale_size_manual( values = c(1.5,1.5) ) +
            scale_colour_manual(values = pal) +
            labs(x='Standardised Mean Difference',y='Density') +
            ggtitle("Estimated Distribution of the SNR") + theme_minimal() +
    theme(plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))
z=seq(-5,5,0.01)
n2=length(z)

proximal.shrink=sapply(z,function(z){shrink(b=z,s=1,p=c(proximal.p,1-proximal.p),tau=c(proximal.tau1,proximal.tau2))})
distal.shrink=sapply(z,function(z){shrink(b=z,s=1,p=c(distal.p,1-distal.p),tau=c(distal.tau1,distal.tau2))})
combined.df2=data.frame(z=rep(z,2),shrink=c(proximal.shrink,distal.shrink),corpus=c(rep("Proximal",n2),rep("Distal",n2)))

combined.p4=ggplot(combined.df2,aes(x=z,y=shrink,color=corpus)) + geom_line(linewidth = 1.5) +
            #scale_size_manual(values = c(1.5, 1.5) ) +
            scale_colour_manual(values = pal) +
            labs(x='z-score',y='Shrinkage Factor', colour = "Outcome") +
            theme_minimal() +
            scale_y_continuous(breaks = seq(1,3,0.5),minor_breaks=seq(1,3,0.25),
                               limits = c(1,3)) +
            ggtitle("Shrinkage factor") +
    theme(plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))

```

```{r shrinkage and estonian biobank results}

# Custom functions
# pdf, cdf and quantile functions for normal mixture distributions 
dmix = function (x,p,m,s){ # density (vector x)
       p %*% sapply (x, function (x) dnorm (x,mean=m,sd=s)) }
pmix = function (x,p,m,s){ # cumulative distr (vector x)
       p %*% sapply (x, function (x) pnorm (x,mean=m,sd=s)) }
rmix = function (n,p,m,s){ d= rmultinom (n,1,p)
       rnorm (n,m %*% d,s %*% d) }
qfun = function (q,p,m,s){ # quantile function scalar q
       uniroot ( function (x) pmix (x,p,m,s) - q, interval= c ( - 20,20)) $ root }
qmix = function (q,p,m,s){ # quantile function vector q
       sapply (q, function (q) qfun (q,p=p,m=m,s=s) ) } 

# Z-score distribution parameters for distal outcomes
distal.pvec=c(distal.p,1-distal.p) # Mixture proportions
distal.tauvec=c(distal.tau1,distal.tau2) # Standard deviation of the mixture components

# New Estonian Biobank study (https://doi.org/10.1038/s41431-025-01894-x)
# CYP2C19 PM vs NM for Total ADRs after antidepressant prescription
ee.b<-log(1.4852150406401) # Original beta (ST6)
ee.s<-0.160236550068608 # Original SE (ST6)
ee.post=posterior(ee.b,ee.s,distal.pvec,distal.tauvec) # Posterior distribution of effects (regularized)
ee.betahat=sum(ee.post$q * ee.post$pm)
new.or <- exp(ee.betahat) # Posterior mean of the OR
ee.shrinkage=ee.b/ee.betahat # Shrinkage factor
ee.ci2=qmix(c(0.025,0.975),ee.post$q,ee.post$pm,ee.post$ps) 
new.ci <- exp(ee.ci2) # Posterior CI of the OR
ee.psign <- pmix(0,ee.post$q,ee.post$pm,ee.post$ps) # Probability of sign error
ee.prob <- 1 - ee.psign # Probability sign is correct
```

We exemplify this procedure by re-analysing a result from a large-scale pharmacogenomic study of 9,563 antidepressant users (escitalopram, citalopram, sertraline or amitriptyline) published after the end date of our literature search (Kariis et al. 2025). The analysis of this cohort showed CYP2C19 poor metabolisers to have an increased risk of reporting adverse effects, a result consistent with existing pharmacogenomic drug-gene guidelines (Brouwer et al. 2022; Bousman et al. 2023). The reported effect for this association is OR = `r round(exp(ee.b), 3)` (95%CI=1.087–2.038). ). From our corpus of results of distal outcomes without filtering by drug or gene (`r length(unique(distal$Study))` studies,`r nrow(distal)` effect sizes), we modelled a two-component mixture of zero-mean normal distributions using the *flexmix* R package (Leisch 2004), using the study ID as a grouping factor. This distribution is a prior for the signal-to-noise ratio of distal outcome studies, and an equivalent prior for reports of proximal outcomes (`r length(unique(proximal$Study))` studies, `r nrow(proximal)` effect sizes) is illustrated for comparison (Supplementary Figure 1). The mixture distribution for distal outcomes had SD1=`r round(distal.tauvec[[1]],3)` and SD2=`r round(distal.tauvec[[2]],3)`, with mixture weights W1=`r round(distal.pvec[1], 3)` and W2=`r round(distal.pvec[2], 3)`. Using code from van Zwet and Gelman (2022), we use these parameters and the original regression betas and standard errors to estimate a posterior mean of OR=`r round(new.or, 3)` (95%CI=`r round(new.ci[1], 3)`–`r round(new.ci[2], 3)`) for the pharmacogenomic result above. While the magnitude of this estimate has shrunk by a factor of `r round(ee.shrinkage, 3)` to account for winner’s curse, the re-analysis still supports a `r round(ee.prob*100, 2)`% probability that CYP2C19 poor metabolism indeed increases the likelihood of reporting adverse effects in individuals prescribed certain antidepressants.  

```{r plot bayesian, warning=FALSE,  out.width="100%", fig.align='center', fig.cap="Supplementary Figure 1. Panel A and B show the distribution of Z-scores observed for proximal and distal outcomes, respectively. The line represents the fitted mixtures of two zero-mean normals for both outcomes. Panel C shows the estimated distribution of the signal-to-noise ratio (SNR) for both proximal and distal outcomes. Panel D shows variation in the shrinkage factor (the ratio of estimated to original effect sizes) across z-values for proximal and distal outcomes. For a new effect size, posterior mean estimates can be calculated by dividing it by the shrinkage factor; thus, the amount of shrinkage decreases as the Shrinkage Factor approaches 1."}
plot_grid(combined.p1, combined.p2, combined.p3,combined.p4, labels = "AUTO")
```

<br>
<br>
<br>
<br>

### Random Effects
#### Assessing Random Effects Structure.
```{r random effects structure 1, warning=FALSE}

V <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = all_smd)

# fit correlated and hierarchical effects model
mod0 <- rma.mv(absmd ~ 1 + rating, 
               V = V,
               random = list(~ 1 | Study),
               method = "REML", test = "t", dfs = 'contain',
               data = all_smd,
               sparse = TRUE)

mod1 <- rma.mv(absmd ~ 1 + rating, 
               V = V,
               random = list(~ 1 | Study / es_id),
               method = "REML", test = "t", dfs = 'contain',
               data = all_smd,
               sparse = TRUE)

mod2 <- rma.mv(absmd ~ 1 + rating, 
               V = V,
               random = list(~ 1 | cohort_id / Study / es_id),
               method = "REML", test = "t", dfs = 'contain',
               data = all_smd,
               sparse = TRUE)


mod3 <- rma.mv(absmd ~ 1 + rating, 
               V = V,
               random = list(~ 1 | es_id, ~ rating | Study),
               method = "REML", test = "t", dfs = 'contain',
               data = all_smd, struct = "UN",
               sparse = TRUE)

# secondary analysis
V <- metafor::vcalc(vi = Var, cluster = Study, obs = es_id, rho = 0.6, data = meta.dat.all)

mod4 <- rma.mv(absmd ~ 1 + rating:mp, 
                        V = V,
                        random = list(~ 1 | Study / es_id),
                        method = "REML", test = "t", dfs = 'contain',
                        data = meta.dat.all,
                        sparse = TRUE)


mod5 <- rma.mv(absmd ~ 1 + rating:mp, 
                        V = V,
                        random = list(~ rating | Study, ~ 1 | es_id), struct = c("UN"),
                        method = "REML", test = "t", dfs = 'contain',
                        data = meta.dat.all,
                        sparse = TRUE)

a1 <- anova(mod0, mod1) # 1 | Study vs 1 | Study / ES ID
a2 <- anova(mod1, mod2) # 1 | Study / ES ID vs  1 | Cohort | Study / ES ID
a3 <- anova(mod1, mod3) #  1 | Study / ES ID vs    1 | ES ID, rating | Study  
a4 <- anova(mod4, mod5) # nested vs complex secondary analysis
```

Model structure was guided by knowledge of dependencies within the dataset, and goodness-of-fit statistics. We fit several different random effects structures allowing random intercepts for (i) Study, (ii) Study / Analysis, and (iii) Cohort / Study / Analysis. These tests were based on simplified versions of the primary model in which no variance-covariance matrix was used in place of effect size variances. Analysis of Variance suggested that model ii demonstrated better fit than model i (LRT = `r round(a1$LRT, 1)`, *p* < 0.0001). There was no significant difference between model ii, and model iii which also includes a random effect for cohort  (LRT = `r round(a2$LRT, 3)`, *p* = `r round(a2$pval, 3)`).

Finally, we tested a more complex random effect structure to allow the variance components at the Study level to differ by the moderator, “rating”. Overall, this was the best fit model and so was used in the primary analysis (LRT = `r round(a3$LRT, 3)`, *p* = `r round(a3$pval, 3)`). However, this structure requires substantial data for its components to be properly estimated and so is not feasible for the sensitivity analyses on the gene-drug subgroups; therefore, we used a simplified random-effects structure for these analyses (i.e., ~1 | Study ID / Effect Size ID). For the secondary analysis which contained an interaction term between rating and metabolism phenotype, we followed the primary analysis, including a “rating| Study” term. This demonstrated better model fit than the simple nested structure (LRT = `r round(a4$LRT,3)`, *p* = `r format_p(a4$pval)`), while balancing the risk for over-parametrisation that would arise with including a term for each moderator. 

Supplementary Figures 2 – 7 show profile-Likelihood plots for the variance components of the primary meta-analysis, the secondary meta-analysis, and the four sensitivity analyses. The plots do not indicate that the models are over-parametrised; the restricted log-likelihood peaks at the parameter estimates and gradually decreases on either side which suggests confidence in these estimates (as opposed to flat or bimodal profiles, which could indicate lack of parameter identifiability). 

Final model structures for the various analyses are described below:

i)	For the primary analysis, the absolute SMD was moderated by rating (i.e., whether the outcome was proximal or distal) and included random effect terms for Study ID (allowed to vary by rating) and Effect Size ID. 

`rma.mv(absmd ~ 0 + rating, V = V, random = list(~ rating | Study, ~ 1 | es_id), struct = "UN", method = "REML", test = "t", dfs = 'contain’, data = all_smd, sparse = TRUE)`

ii)	For the sensitivity analyses, the absolute SMD was moderated by rating and included a simplified random effect term for Effect Size ID nested within Study ID (example given for Risperidone-CYP2D6 analysis). 

`rma.mv(absmd ~ 0 + rating, V = Vris, random = list(~ 1 | Study / es_id), method = "REML", test = "t", dfs = 'contain', data = ris_smd, sparse = TRUE)`

iii)	For the secondary analysis, the absolute SMD was moderated by a rating-metabolism phenotype interaction and included random effect terms for Study ID (allowed to vary by rating) and Effect Size ID.

`rma.mv(absmd ~ 0 + rating:mp, V = V, random = list(~ rating | Study, ~ 1 | es_id), struct = c("UN"), method = "REML", test = "t", dfs = 'contain', data = meta.dat.all, sparse = TRUE)`


<br>
<br>
<br>
<br>

### Profile Plots
#### Profile Likelihood plots for Assessing Model Over-parameterisation.
##### Primary Analysis
```{r primary profile plot, echo = FALSE, message=FALSE, fig.align='center', out.width="200%", fig.cap="Supplementary Figure 2. Profile likelihood plots for the variance components of the primary analysis. The X axis represents variance component estimates, with the dotted line intersecting with the X axis represents the value of the variance component as calculated by the primary model. The Y axis represents the restricted logLikelihood at each variance component estimate."}
knitr::include_graphics("profiles/final/img/primary.png")
```

<br>
<br>

##### Profile Plots for Gene-Drug Subgroup Analyses
The profile plots for the sensitivity analyses do not indicate that the models are over-parametrised.

###### Risperidone x CYP2D6 
```{r sensitivity 1 profile plot, echo = FALSE, message=FALSE, fig.align='center', out.width="150%", fig.cap="Supplementary Figure 3. Profile likelihood plots for the variance components of the sensitivity analysis (Risperidone and CYP2D6). The X axis represents variance component estimates, with the dotted line intersecting with the X axis represents the value of the variance component as calculated by the primary model. The Y axis represents the restricted logLikelihood at each variance component estimate."}
knitr::include_graphics("profiles/final/img/ris.png")
```

<br>
<br>

###### Escitalopram x CYP2C19 
```{r sensitivity 2 profile plot, echo = FALSE, message=FALSE, fig.align='center',  out.width="150%", fig.cap="Supplementary Figure 4. Profile likelihood plots for the variance components of the sensitivity analysis (Escitalopram and CYP2C19). The X axis represents variance component estimates, with the dotted line intersecting with the X axis represents the value of the variance component as calculated by the primary model. The Y axis represents the restricted logLikelihood at each variance component estimate."}
knitr::include_graphics("profiles/final/img/esc.png")
```

<br>
<br>

###### Aripiprazole x CYP2D6
```{r sensitivity 5 profile plot, echo = FALSE, message=FALSE, fig.align='center',  out.width="150%", fig.cap="Supplementary Figure 5. Profile likelihood plots for the variance components of the sensitivity analysis (Aripiprazole and CYP2D6). The X axis represents variance component estimates, with the dotted line intersecting with the X axis represents the value of the variance component as calculated by the primary model. The Y axis represents the restricted logLikelihood at each variance component estimate."}
knitr::include_graphics("profiles/final/img/ari.png")
```

<br>
<br>

###### Haloperidol x CYP2D6 
```{r sensitivity 6 profile plot, echo = FALSE, message=FALSE, fig.align='center',  out.width="150%", fig.cap="Supplementary Figure 7. Profile likelihood plots for the variance components of the sensitivity analysis (Haloperidol and CYP2D6). The X axis represents variance component estimates, with the dotted line intersecting with the X axis represents the value of the variance component as calculated by the primary model. The Y axis represents the restricted logLikelihood at each variance component estimate."}
knitr::include_graphics("profiles/final/img/hal.png")
```

<br>
<br>

##### Secondary Analysis
```{r secondary profile plot, echo = FALSE, message=FALSE, fig.align='center', out.width="200%", fig.cap="Supplementary Figure 7. Profile likelihood plots for the variance components of the secondary analysis. The X axis represents variance component estimates, with the dotted line intersecting with the X axis represents the value of the variance component as calculated by the secondary model. The Y axis represents the restricted logLikelihood at each variance component estimate."}
knitr::include_graphics("profiles/final/img/secondary.png")
```

<br>
<br>
<br>
<br>

### VCOV matrix
#### Approximating the Variance-Covariance matrix using different values of ρ.
To account for dependencies in our data, we imputed a variance-covariance matrix and use this in place of effect size variances or standard errors as the variance argument in our meta-analysis. In the absence of information regarding correlations in raw data, we used ρ = 0.6 (i.e.  assuming sampling correlation of 0.6 between effects of the same study) to impute the matrix used in our primary analysis as suggested in previous work (Pustejovsky and Tipton 2022). 

As a sensitivity analysis, we tested how our effect estimates were affected by assuming different sampling correlations (i.e., changing the value of ρ, from 0 to 0.95 at intervals of 0.05). We plot the estimate and confidence intervals for the difference between proximal and distal outcomes (Supplementary Figure 8), as well as examining the variance components (i.e., σ^2^, τ^2.1^, τ^2.2^ as in Supplementary Figure 9). Overall, there is little effect of changing the assumed sampling correlation, ρ, on key model coefficients or variance components. 


```{r load dat for sensitivity vcov, include = FALSE, echo=FALSE,warning=FALSE}
sens1 <- read_table(file = "profiles/final/coefs.txt")
sens2 <- read_table(file = "profiles/final/var.txt")

df <- cbind(sens1, sens2)
```

```{r robust variance estimator plot 1, warning=FALSE, echo = FALSE, fig.align='center', fig.cap="Supplementary Figure 8. Estimates for the difference between proximal and distal effect sizes are plotted at each value of the assumed constant sampling correlation (ρ) in the imputation of the variance-covariance matrix for the primary meta-analysis. The vertical dashed line represents ρ = 0.6, the value recommended in Pustejovsky and Tipton (2022). Estimates are from an intercept model. Shaded area represents robust 95% confidence intervals around the estimates."}
 
ggplot(data=df, aes(x=p, y=Estimate)) +
  geom_point() +
  geom_line(linewidth = 2, colour = "orchid" ) +
  geom_ribbon(aes(ymin=CI_L, ymax=CI_U), linetype=0, alpha=0.1, fill = "darkorchid4") +
 # scale_fill_manual(values = pal) +
  geom_vline(xintercept = 0.6, linetype = "dashed") +
  coord_cartesian(xlim = c(0,1), ylim = c(-0.5,0)) +
  xlab("Assumed sampling correlation (ρ)") +
  ylab("Effect Size") +
  theme_minimal() +
    theme(legend.title=element_blank(),
        axis.title = element_text(colour = "#474044", size = 14),
            axis.text.x = element_text(colour = "#474044", size = 11),
            axis.text.y = element_text(colour = "#474044", size = 11, hjust = 0.5),
            axis.ticks = element_line(colour = "#474044"),
            plot.title = element_text(colour = "#474044"),
                   plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))
```

<br>
<br>

```{r robust variance estimator plot 2, warning=FALSE, fig.align='center', fig.cap="Supplementary Figure 9. Variance component estimates for within-study (σ2), between-study (proximal; τ2.1) and between-study (distal; τ2.2) heterogeneity from across different values of the assumed sampling correlation coefficient (ρ) in the imputation of the variance-covariance matrix for the primary meta-analysis. The vertical dashed line represents ρ = 0.6, the value recommended in Pustejovsky and Tipton (2022)."}
pal <- c("#476A6F", "#e4959a", "#519E8A", "#474044")

var_sig <- df %>% dplyr::select(Outcome, s2, t21, t22, r, p) 
var_sig <- pivot_longer(var_sig, cols = c(s2, t21, t22, r), names_to = c("comp"))
xlabels <- c("s2" = expression("σ"^2), "t21" = expression("τ"^2.1), "t22" = expression("τ"^2.2), "r" = expression("ρ"))

ggplot(data=var_sig, aes(x = p, y=value, colour= comp)) +
  geom_point() +
  geom_line(linewidth = 2) +
  #scale_colour_manual(values = pal) +
  geom_vline(xintercept = 0.6, linetype = "dashed") +
  coord_cartesian(xlim = c(0,1), ylim = c(-1, 1)) +
  xlab("Assumed sampling correlation (ρ)") +
  ylab("Variance Estimate") +
  scale_color_discrete(pal, name = "", labels = xlabels, type = pal)+
  guides(colour=guide_legend(title="Variance Component")) +
  theme_minimal() +
    theme(legend.title=element_blank(),
        axis.title = element_text(colour = "#474044", size = 14),
            axis.text.x = element_text(colour = "#474044", size = 11),
            axis.text.y = element_text(colour = "#474044", size = 11, hjust = 0.5),
            axis.ticks = element_line(colour = "#474044"),
            plot.title = element_text(colour = "#474044"),
                   plot.background = element_rect(fill = "#EFEFEF", colour = "#EFEFEF"), 
            panel.background = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"),
            legend.background = element_rect(fill="#EFEFEF",  colour = "#EFEFEF"), 
            legend.key = element_rect(fill = "#EFEFEF",  colour = "#EFEFEF"))
```

<br>
<br>
<br>
<br>

### Risk of Bias
#### Assessing Risk of Bias
```{r multilevel eggers test}

all_smd$se.eff.size <- sqrt(all_smd$Var)
all_smd$prec <- 1/sqrt(all_smd$Total_N)

# read here for interpreting output: https://stat.ethz.ch/pipermail/r-sig-meta-analysis/2018-February/000610.html

# Egger's regression test can be conducted simply by using the standard errors of the effect size estimates (i.e., the "sei") as a predictor in a meta-regression. Using cluster-robust variance estimation with this meta-regression will take care of the dependence issue. A significant coefficient on the standard error predictor would indicate funnel plot asymmetry. (Although as always, a lack of statistically significance does not *prove* that the funnel plot is symmetric.) When I've used this technique, I fit the meta-regression without any random effects in the model so that larger studies are given relatively more weight for estimating the meta-regression coefficients.

# The slope on sqrt(vi) indicates an association between SE and effect size. The intercept is a "PET"-style estimate of the average effect size in a population of infinitely large studies (i.e. SE = 0).

# The positive relationship between effect size estimate and its standard error indicates the evidence of publicaiton bias or small study effects

egger <- rma.mv(yi = absmd, 
                 V = Var, 
                 mods = ~ prec, 
                 random = list(~ 1 | Study/es_id), 
                 method = "REML", test = "t", dfs = "contain", 
                 data = all_smd, 
                 sparse = TRUE)

egger2 <- rma.mv(yi = absmd, 
                 V = Var, 
                 mods = ~ prec, 
                 random = list(~ 1 | es_id, ~ rating | Study), struct = "UN", 
                 method = "REML", test = "t", dfs = "contain", 
                 data = all_smd, 
                 sparse = TRUE)


a <- robust(egger2, cluster = Study, adjust = "CR2", clubSandwich = T)


```

Funnel plots suggest a risk of small-study effects among the studies included in the primary meta-analysis (Supplementary Figure 10). This is supported by our results from an adapted version of Egger’s test (estimate = `r round(a$b[2],2)`, *p* = `r format_p(a$pval[2])`). Our methodology fits with current best-practice for dealing with biases, including publication bias, in similar meta-analyses (Yang et al., 2024). 

```{r funnel plot, fig.align='center', dev.args=list(bg='transparent')}

with(all_smd, funnel(SMD, se.eff.size, 
                     yaxis = "sei", 
                     level=c(90, 95, 99), shade=c("white", "gray55", "gray75"), 
                     legend=F,
                     xlab = "Standardized mean difference (SMD)", ylab = "SE", back = "#EFEFEF")) 

with(all_smd, funnel(SMD, prec, 
                     level=c(90, 95, 99), shade=c("white", "gray55", "gray75"), 
                     legend=F,
                     xlab = "Standardized mean difference (SMD)", ylab = expression(1/sqrt(N)), back = "#EFEFEF"))

```

Supplementary Figure 10. Upper plot demonstrates a traditional funnel plot of the effect measure against the standard error. Lower plot demonstrates a funnel plot of the effect measure against a sample-size based measure of precision, as recommended for meta-analyses using the Standardised Mean Difference as the effect size measure (Zwetsloot et al. 2017).

<br>
<br>
<br>
<br>

### Sensitivity Analyses
#### No-Intercept Output
The sensitivity analysis replicated the primary model in subgroups restricted to gene-drug pairings. Full model results are detailed in Supplementary Table 14, below. The results in the manuscript represent the difference between effect sizes for proximal and distal outcomes. Here, we report estimates for proximal and distal outcomes, separately for each of the subgroup analyses.

```{r all gene-drug subgrops analyses (no intercept)}
# fit correlated and hierarchical effects model
meta.ris <- rma.mv(absmd ~ 0 + rating, 
                    V = Vris,
                    random = list(~ 1 | Study / es_id),
                    method = "REML", test = "t", dfs = 'contain',
                    data = ris_smd,
                    sparse = TRUE)

meta.ris <- robust(meta.ris, cluster = Study, adjust = "CR2", clubSandwich = T)

# fit correlated and hierarchical effects model
meta.esc <- rma.mv(absmd ~ 0 + rating, 
                    V = Vesc,
                    random = list(~ 1 | Study / es_id),                   
                    method = "REML", test = "t", dfs = 'contain',
                    data = esc_smd,
                    sparse = TRUE)

meta.esc <- robust(meta.esc, cluster = Study, adjust = "CR2", clubSandwich = T)

# fit correlated and hierarchical effects model
meta.ari <- rma.mv(absmd ~ 0 + rating, 
                    V = Vari,
                    random = list(~ 1 | Study / es_id),                   
                    method = "REML", test = "t", dfs = 'contain',
                    data = ari_smd,
                    sparse = TRUE)

meta.ari <- robust(meta.ari, cluster = Study, adjust = "CR2", clubSandwich = T)

# fit correlated and hierarchical effects model
meta.hal <- rma.mv(absmd ~ 0 + rating, 
                    V = Vhal,
                    random = list(~ 1 | Study / es_id),
                    method = "REML", test = "t", dfs = 'contain',
                    data = hal_smd,
                    sparse = TRUE)

meta.hal <- robust(meta.hal, cluster = Study, adjust = "CR2", clubSandwich = T)

```


```{r sensitivity full output}
a <- broom::tidy(meta.ris)
df <- a %>% dplyr::select(c("term", "estimate", "std.error", "p.value"))
df$p.value <- format_p(df$p.value)
a <- df 
a$Subgroup <- "CYP2D6 - Risperidone"

b <- broom::tidy(meta.esc)
df <- b %>% dplyr::select(c("term", "estimate", "std.error", "p.value"))
df$p.value <- format_p(df$p.value)
b <- df 
b$Subgroup <- "CYP2C19 - Escitalopram"

c <- broom::tidy(meta.ari)
df <- c %>% dplyr::select(c("term", "estimate", "std.error", "p.value"))
df$p.value <- format_p(df$p.value)
c <- df 
c$Subgroup <- "CYP2D6 - Aripiprazole"

d <- broom::tidy(meta.hal)
df <- d %>% dplyr::select(c("term", "estimate", "std.error", "p.value"))
df$p.value <- format_p(df$p.value)
d <- df 
d$Subgroup <- "CYP2D6 - Haloperidol"

df <- rbind(a,b,c,d)
df$term[df$term == "ratingProximal"] <- "Proximal"
df$term[df$term == "ratingDistal"] <- "Distal"

df <- dplyr::select(df, c("Subgroup", "term", "estimate", "std.error", "p.value"))

DT::datatable(df, colnames = c("Subgroup","Outcome", "Estimate", "Standard Error", "p value"), rownames = FALSE, caption = "Supplementary Table 14. Results from sensitivity analyses (no-intercept models) testing whether pharmacogenomic effect sizes are moderated by outcome type across gene-drug pairings.", options = list(
  info = FALSE,
  paging = FALSE,
  searching = FALSE
)) %>% DT::formatRound(columns = c('estimate', 'std.error'), digits = 4)
```

<br>
<br>
<br>
<br>

### Secondary Analysis
#### Full Model Output
The secondary analysis expanded on the primary model by including an interaction term between outcome type (proximal vs distal) and metabolism phenotype (poor, intermediate, rapid, and ultra-rapid). An unstructured variance structure allowed between-study heterogeneity to vary across proximal and distal outcomes. Full model results are detailed in Supplementary Table 15, below. 

```{r secondary full output}
a <- broom::tidy(meta.int)
df <- a %>% dplyr::select(c("term", "estimate", "std.error", "p.value"))

df$p.value <- format_p(df$p.value)

DT::datatable(df, colnames = c("Interaction", "Estimate", "Standard Error", "p value"), rownames = FALSE, caption = "Supplementary Table 15. Full results from secondary analysis testing whether pharmacogenomic effect sizes are moderated by an interaction between outcome type and metabolism phenotype.", options = list(
  info = FALSE,
  paging = FALSE,
  searching = FALSE
)) %>% DT::formatRound(columns = c('estimate', 'std.error'), digits = 4)
```

<br>
<br>
<br>
<br>

## <strong> Supplementary References </strong> 
### Supplementary References

<br>
<br>
<br>
<br>

## <strong> Session Info </strong> 

```{r session info}
sessionInfo()
```


<br>
<br>

